Keycloak自定义Provider依赖Quarkiverse包的生产部署问题
核心问题原因
直接将quarkus-cxf的所有依赖jar放入Keycloak的providers目录,会和Keycloak内置的Quarkus/SmallRye组件版本冲突,导致类加载时出现类型不兼容错误——Keycloak自带的SmallRye Config版本与quarkus-cxf依赖的版本不匹配,引发QuarkusConfigFactory无法被识别为SmallRyeConfigFactory的子类型。
正确处理方式
1. 用Keycloak BOM统一依赖版本
在自定义Provider项目的pom.xml中引入Keycloak的Quarkus BOM,确保所有依赖(包括quarkus-cxf)的版本与Keycloak内置版本对齐:
<dependencyManagement> <dependencies> <!-- 替换为你使用的Keycloak版本 --> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-quarkus-bom</artifactId> <version>${keycloak.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 引入适配Keycloak Quarkus版本的quarkus-cxf BOM --> <dependency> <groupId>io.quarkiverse.cxf</groupId> <artifactId>quarkus-cxf-bom</artifactId> <version>${quarkus-cxf.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意:quarkus-cxf.version需选择与Keycloak内置Quarkus版本兼容的版本,比如Keycloak 22.x对应Quarkus 2.16.x,需匹配该Quarkus版本的quarkus-cxf版本。
2. 打包Provider为含内部依赖的Jar
不要单独复制quarkus-cxf依赖jar到providers目录,而是用maven-shade-plugin将所需依赖打包到Provider Jar内部的lib目录,同时排除Keycloak已内置的组件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <artifactSet> <includes> <include>io.quarkiverse.cxf:*</include> <include>org.apache.cxf:*</include> <!-- 按需添加其他非Keycloak内置的依赖 --> </includes> <excludes> <exclude>io.quarkus:*</exclude> <exclude>io.smallrye:*</exclude> <exclude>org.keycloak:*</exclude> </excludes> </artifactSet> </configuration> </execution> </executions> </plugin> </plugins> </build>
这样打包后的Provider Jar会包含所需的quarkus-cxf依赖,且不会与Keycloak内置组件冲突。
3. 部署仅需放入Provider Jar
将打包好的Provider Jar(含内部依赖)放入Keycloak分发包的providers目录,无需额外添加quarkus-cxf依赖Jar,直接执行:
./kc.bat build
4. 验证依赖兼容性
如果仍有问题,可通过以下命令查看Keycloak内置依赖版本,确保quarkus-cxf版本完全适配:
./kc.bat dev --debug
在启动日志中查找Quarkus和SmallRye Config的版本,核对quarkus-cxf的兼容版本。
内容的提问来源于stack exchange,提问作者gruszka

