同一应用程序中的javax.json和jakarta.json:无法将jsonProviderImpl强制转换为jakarta.json.spi.jsonProvider

1wnzp6jl  于 2023-02-18  发布在  Java
关注(0)|答案(2)|浏览(407)

我正在开发一个面向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.jsonorg.classfish:javax.json都定义了相同的类org.classfish.json.JsonProviderImpl(一个使用javax.json.*类,一个使用jakarta.json.*类...),因此我无法简单地包含这两个maven工件。
JsonProviderImpl的实现(在两个工件中!)默认情况下基本上返回以下内容:

return Class.forName("org.glassfish.json.JsonProviderImpl");

org.glassfish:jakarta.jsonorg.classfish:javax.json都在类路径上时,这将导致从另一个包获取JsonProviderImpl的任何实现出现问题。
我能做些什么来解决这个问题?

qvk1mo1f

qvk1mo1f1#

供参考:This has been fixed by the Elastic team:他们已经从Glassfish实现切换到

api("org.glassfish", "jakarta.json", "2.0.1")

Eclipse Parsson

api("jakarta.json:jakarta.json-api:2.0.1")
api("org.eclipse.parsson:parsson:1.0.0")
lfapxunr

lfapxunr2#

一种解决方案似乎是使用maven shade插件将“new”org.glassfish:jakarta.json中的包org.glassfish.json“重命名”为jakarta.org.glassfish.json

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <filters>
          <filter>
            <artifact>org.glassfish:jakarta.json</artifact>
            <includes>
              <include>org/glassfish/json/**</include>
            </includes>
          </filter>
        </filters>
        <artifactSet>
          <includes>
            <include>org.glassfish:jakarta.json</include>
          </includes>
        </artifactSet>
        <relocations>
          <relocation>
            <pattern>org.glassfish.json</pattern>
            <shadedPattern>jakarta.org.glassfish.json</shadedPattern>
          </relocation>
        </relocations>
      </configuration>
    </plugin>
  </plugins>
</build>

然后,可以创建包含以下内容的文件src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider

jakarta.org.glassfish.json.JsonProviderImpl

这将告诉jakarta.json.spi.JsonProvider的实现使用JsonProviderImpl的阴影版本(来自org.glassfish:jakarta.json工件-它使用jakarta.json.*类),而不是JsonProviderImpl(与org.glassfish:javax.json同名)。

相关问题