Java KeyClope-自定义SPI未出现在列表中
我为我的KeyClope服务器定制了一个SPI,现在我必须在管理控制台上配置它 我将SPI添加为一个模块,并进行手动安装,因此我将其放在modules/{package name}/main上,并带有module.xml;我还将安装在standalone.xml上,也将安装在keydepot服务器子系统中 完成所有这些配置后,我会转到管理控制台来配置自定义用户提供程序,但它不会出现在列表中Java KeyClope-自定义SPI未出现在列表中,java,spring-boot,wildfly,keycloak,spi,Java,Spring Boot,Wildfly,Keycloak,Spi,我为我的KeyClope服务器定制了一个SPI,现在我必须在管理控制台上配置它 我将SPI添加为一个模块,并进行手动安装,因此我将其放在modules/{package name}/main上,并带有module.xml;我还将安装在standalone.xml上,也将安装在keydepot服务器子系统中 完成所有这些配置后,我会转到管理控制台来配置自定义用户提供程序,但它不会出现在列表中 我能做什么?考虑将您的SPI实现部署为JAR或EAR。当我想将它们作为JBoss模块部署到Key斗篷时,我
我能做什么?考虑将您的SPI实现部署为JAR或EAR。当我想将它们作为JBoss模块部署到Key斗篷时,我也遇到了一些麻烦,但我不记得具体是什么(在我的公司,我们使用自定义SPI实现对Key斗篷进行了大量定制,包括身份验证程序、UserStorageProvider、REST端点、OIDC映射器……)。现在我们将它们部署为EAR包。以下是如何使用maven执行耳朵打包:
<name>Keycloak Extensions EAR</name>
<artifactId>cardpay-extensions</artifactId>
<packaging>ear</packaging>
<properties>
...
</properties>
<dependencies>
<!-- Your jars with provider implementations, I'm use two jars (for unit testing simplicity) -->
<dependency>
<groupId>com.acme</groupId>
<artifactId>extensions-core</artifactId>
<version>${project.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.acme</groupId>
<artifactId>extensions-providers</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<version>8</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<outputFileNameMapping>@{artifactId}@.@{extension}@</outputFileNameMapping>
</configuration>
</plugin>
</plugins>
</build>
现在您可以使用maven-wildfly插件进行mvn-wildfly:deploy,或者通过JBoss-cli或部署扫描程序手动部署ear(查看wildfly工件部署文档)。您应该在Wildfly日志中看到关于扩展部署的相应消息(将有ProviderFactory id)
关于使用模块时SPI实现的不可用性,我想这是因为JBoss模块加载太早,所以Keyclope deployer子系统没有看到它们。我的最终解决方案是应用
并将EntityManager的用户存储库更改为与数据库连接。找到了一种方法,就是在
类路径:${jboss.home.dir}/providers/
中添加文件,因为在其中找到的模块中的SPI由Keyclope解释
有关的详细信息。好的,现在它可以与热部署一起使用,但它仍然没有出现在列表中。我也要换衣服吗?因为现在我有了“master”,您可以在ServerInfo->Providers(服务器范围的信息)中搜索SPI实现的提供者id。如果你找到了,一切都好。您实现了哪种类型的SPI?最后,我将UserRepository中的示例应用于EntityManger,它可以工作。哦,是的,EntityManager,最后请记住为什么将SPI实现部署为静态JBoss模块对我不起作用。据我所知,Wildfly只有用于动态部署(EAR、WAR、JAR)的EJB钩子,但静态模块启动得太早,所以不会将EntityManager注入SPI bean。
<?xml version="1.0" ?>
<jboss-deployment-structure>
<!-- Core module -->
<module name="deployment.extensions.core">
<resources>
<resource-root path="lib/core.jar"/>
</resources>
<dependencies>
<module name="com.oracle.ojdbc" export="true"/>
<module name="org.jboss.logging" export="true"/>
<module name="org.apache.commons.io" export="true"/>
<module name="javax.ws.rs.api" export="true"/>
<module name="org.keycloak.keycloak-common" export="true"/>
<module name="org.keycloak.keycloak-core" export="true"/>
<module name="org.keycloak.keycloak-server-spi" export="true"/>
<module name="org.keycloak.keycloak-server-spi-private" export="true"/>
<module name="org.keycloak.keycloak-services" export="true"/>
</dependencies>
</module>
<!-- Define dependency on core module for all sub-deployments -->
<deployment>
<dependencies>
<module name="deployment.extensions.core" export="true"/>
</dependencies>
</deployment>
<!-- Providers bundle -->
<sub-deployment name="providers.jar">
<dependencies>
<module name="javax.api"/>
</dependencies>
</sub-deployment>
</jboss-deployment-structure>