我遇到此错误
java.lang.LinkageError: ClassCastException: attempting to tomcat-debug-eclispe/wtpwebapps/xwiki-debug-eclipse/WEB-INF/lib/jsr311-api-1.1.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to tomcat-debug-eclispe/lib/jboss-jaxrs-api_2.0_spec-1.0.1.Final.jar!/javax/ws/rs/ext/RuntimeDelegate.class
我正在使用一个名为xwiki
的开源Wiki平台
https://github.com/xwiki/xwiki-platform
该平台包含jsr311-api-1.1.1.jar
并且需要它。
现在,我想通过XWiki扩展程序连接某些密钥隐藏功能,而我需要
<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-admin-client -->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>4.3.0.Final</version>
</dependency>
我们可以看到here keycloak-admin-client需要一些提供的依赖项,包括:
<dependency>
<groupId>org.jboss.spec.javax.ws.rs</groupId>
<artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
<version>1.0.1.Final</version>
<scope>provided</scope>
</dependency>
所以从org.keycloak.admin.client.Keycloak
我打
Keycloak.getInstance(keycloakUrl, keycloakRealm, keycloakUser, keycloakPwd, "admin-cli");
这时我正在运行的应用程序(因为一切运行良好)给了我上面的ClassCastException
。
这是一个全球性的JAVE问题,我无法提供更多代码,因为最后您将无法构建XWiki / Keycloak运行环境并重现该问题(因为在eclipse中,通过单位测试,在xwiki环境之外没有冲突,Keycloak.getInstance
可以正常工作)。
在这种情况下我该怎么办?有避免这些冲突的行之有效的方法吗?也许需要重新实现的课程?
环境:
tomcat 9.0.12
XWiki 10.6.1
Keycloak 4.3.0
Java 8
答案 0 :(得分:1)
之所以嵌入jsr311-api而不是仅仅作为提供的作用域依赖项,是因为Java 9不再包含JAX-RS API(在Java 8中已经存在),并且它是各种应用程序服务器的问题(没有没注意到Tomcat 9已经决定提供JAX-RS API,但我想它应该支持Java 9。参见https://jira.xwiki.org/browse/XWIKI-14743。
现在,XWiki仍然基于(非常老的)JAX-RS 1的原因是Restlet基于JAX-RS 1,而JAX-RS 2的兼容性不那么出色,因此当您使用XWiki时,会遇到各种问题尝试使用它运行Restlet。
如果将Tomcat 9更改为Tomcat 8,则不会再出现启动错误。不幸的是,如果密钥斗篷需要JAX-RS 2,这将不容易。也许旧版本的keycloak是基于JAX-RS 1的,但是降级确实不是很好。我创建了https://jira.xwiki.org/browse/XWIKI-15588。