首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于外部Jar的Keycloak自定义SPI部署

基于外部Jar的Keycloak自定义SPI部署
EN

Stack Overflow用户
提问于 2020-04-13 10:18:46
回答 1查看 2.8K关注 0票数 8

我有一个SPI实现,即:

  • 自定义SPI,直接通过SPI接口实现
  • 具有JBoss基中不存在的外部jar。

1) EAR部署:我尝试了EAR部署,并将我的.ear部署到/独立/部署。这解决了绑定在EAR的lib文件夹中的外部jar问题。但是现在SPI没有初始化(我在调试时看到了这一点),并且在触发SPI时也得到了异常:

代码语言:javascript
复制
11:34:02,185 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: Keycloak 9.0.2 (WildFly Core 10.0.3.Final) started in 12070ms - Started 732 of 1031 services (613 services are lazy, passive or on-demand)
11:34:18,209 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-1) Uncaught server error: java.lang.NullPointerException
        at org.keycloak.keycloak-services@9.0.2//org.keycloak.services.DefaultKeycloakSessionFactory.getAllProviderIds(DefaultKeycloakSessionFactory.java:362)

然后我想,也许keycloak无法通过独立/部署来导入扩展的SPI,如果您开发自定义的SPI keycloak建议(或者需要?),也会提到这里。模块部署。

2)然后我尝试了模块部署;现在我可以看到我的自定义SPI正在初始化,但是现在keycloak无法找到我的外部JAR。

代码语言:javascript
复制
13:17:05,682 FATAL [org.keycloak.services] (ServerService Thread Pool -- 65) java.lang.RuntimeException: org.jboss.modules.ModuleNotFoundException: com.orbitz.consul

作为一种解决方案,我找到了一个可以将依赖jar及其所有依赖JAR放到${KEYCLOAK_HOME}\modules\system\layers\keycloak的地方,但我不想手动将外部JAR及其所有依赖项安装到keycloak的基础上(可能是自动的吗?)。有解决办法吗?

部署为模块的脚本:

代码语言:javascript
复制
./jboss-cli.bat --command="module add --name=de.easy.one.bouncer.spi.registry --resources=target/registry-spi-1.0.1-SNAPSHOT.jar --dependencies=org.keycloak.keycloak-core,org.keycloak.keycloak-services,org.keycloak.keycloak-server-spi,org.keycloak.keycloak-server-spi-private,javax.api,javax.ws.rs.api,com.fasterxml.jackson.core.jackson-core,com.fasterxml.jackson.core.jackson-databind,com.fasterxml.jackson.core.jackson-annotations,org.jboss.logging,com.orbitz.consul"

并将其添加到standalone.xml中如下:

代码语言:javascript
复制
<provider>module:de.easy.one.bouncer.spi.registry</provider>

META-INF/服务

文件名->文件内容

org.keycloak.provider.Spi -> de.easy.one.bouncer.spi.registry.spi.RegistryProviderSpi

de.easy.one.bouncer.spi.registry.spi.RegistryProviderFactory -> de.easy.one.bouncer.spi.registry.consul.ConsulRegistryProviderFactory

我的pom.xml

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-server-spi</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-server-spi-private</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-services</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- this is not provided and I want to use as external jar -->
    <dependency>
        <groupId>com.orbitz.consul</groupId>
        <artifactId>consul-client</artifactId>
        <version>1.4.2</version>
    </dependency>
</dependencies>
EN

回答 1

Stack Overflow用户

发布于 2021-02-23 03:54:09

尝试创建一个具有内部所有非提供依赖项的UBER JAR包。

pom.xml:

代码语言:javascript
复制
    <properties>
        <uber-jar.name>${project.artifactId}</uber-jar.name>
        <shade.plugin.version>3.2.1</shade.plugin.version>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${shade.plugin.version}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <finalName>${uber-jar.name}</finalName>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>

                                    <!-- Anti-`Invalid signature file digest` -->
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61185744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档