我正在开发一个面向Java EE 8应用服务器(JBoss/Wildfly)的应用程序。
但是,其中一个依赖项(elasticsearch api)已经在使用jakarta.json.*
类,这会在运行时导致ClassCastException:
java.lang.ClassCastException:无法将jsonProviderImpl强制转换为jakarta. json. spi. jsonProvider
这是因为我的类路径(org.classfish:javax.json:1.1.4
)中的org.classfish.json.JsonProviderImpl
仍然使用javax.json类。
但是,由于org.glassfish:jakarta.json
和org.classfish:javax.json
都定义了相同的类org.classfish.json.JsonProviderImpl
(一个使用javax.json.*
类,一个使用jakarta.json.*
类...),因此我无法简单地包含这两个maven工件。
JsonProviderImpl的实现(在两个工件中!)默认情况下基本上返回以下内容:
return Class.forName("org.glassfish.json.JsonProviderImpl");
当org.glassfish:jakarta.json
和org.classfish:javax.json
都在类路径上时,这将导致从另一个包获取JsonProviderImpl
的任何实现出现问题。
我能做些什么来解决这个问题?
2条答案
按热度按时间qvk1mo1f1#
供参考:This has been fixed by the Elastic team:他们已经从Glassfish实现切换到
至Eclipse Parsson:
lfapxunr2#
一种解决方案似乎是使用maven shade插件将“new”
org.glassfish:jakarta.json
中的包org.glassfish.json
“重命名”为jakarta.org.glassfish.json
:然后,可以创建包含以下内容的文件
src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
:这将告诉
jakarta.json.spi.JsonProvider
的实现使用JsonProviderImpl
的阴影版本(来自org.glassfish:jakarta.json
工件-它使用jakarta.json.*
类),而不是JsonProviderImpl
(与org.glassfish:javax.json
同名)。