当两个jar有相同的类集时,使用jboss/wildfly加载类会发生冲突,如何设置顺序/优先级?

x33g5p2x  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(212)

我有一个war文件要部署在jboss/wildfly上。war在它的WEB-INF/lib目录中包含了一些jar文件。其中一些jar文件包含了相同类的冲突(或者至少是不同的)版本。
例如,有一个来自我们遗留代码中两个源的伪代码的jar,它是在maven中定义的,所以它可能在一个或另一个类中使用,我不能删除任何一个。

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>10.1.0</version>
</dependency>

这会带来伪核的伪依赖性:10.2.3

<dependency>
    <!-- Required to use PATCH -->
    <groupId>com.netflix.feign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>8.18.0</version>
</dependency>

这会带来伪核的伪依赖性:8.18.0
两者都有一个响应类,但其中一个没有代码所需的特定create方法。
问题是当jboss/wildfly部署这个war文件时,它会将所有依赖项都放在WEB-INF/lib文件夹中,并且两个jar文件都在那里,那么jar文件在这里的顺序/优先级是什么?如果类加载器选择第一个jar文件,它会抛出一个错误,否则它会正常工作。
在第一种情况下,它会掷回这个错误:

java.lang.无此类方法错误:创建一个新的响应。Java/实用程序/Map; Lfeign/响应$正文;)Lfeign/响应;

我们怎样才能避免这种情况?

vxqlmq5t

vxqlmq5t1#

Maven不会将feign-core的两个版本都打包到WAR中,除非groupId发生了更改。Maven将始终只为给定的groupId和artifactId选择一个版本。
一般来说,你应该尝试让它与较新的版本。如果这是不可能的,你可以考虑使用Maven阴影插件的阴影。

相关问题