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

Posted

技术标签:

【中文标题】当两个 jar 具有相同的类集时,使用 jboss/wildfly 的类加载冲突,如何设置顺序/优先级?【英文标题】:Class Loading conflict using jboss/wildfly when two jars have same set of classes, how to set order/precedence? 【发布时间】:2021-10-07 01:02:08 【问题描述】:

我有一个要部署在 jboss/wildfly 上的 war 文件。战争在其 WEB-INF/lib 目录中包含许多 jar。其中一些 jar 包含相同类的冲突(或至少不同)版本。

例如, 有一罐 feign 来自我们遗留代码中的两个来源并在 maven 中定义,因此它可能在一个或其他类中使用,我无法删除任何类。

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

这带来了 feign-core:10.2.3 的 Feign Dependency

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

这带来了 feign-core:8.18.0 的 Feign Dependency

两者都有一个响应类,但其中一个没有代码所需的特定 create 方法。

问题是当 jboss/wildfly 部署这个 war 文件时,它会将所有依赖项带到 WEB-INF/lib 文件夹中,并且两个 jar 都在那里,这里的 jar 文件的顺序/优先级是什么?如果 classloader 选择了第一个 jar,它会抛出错误,否则它会正常工作。

在第一种情况下,它会抛出此错误:

java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

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

【问题讨论】:

【参考方案1】:

Maven 不会将feign-core 的两个版本都打包到 WAR 中,除非 groupId 发生了变化。 Maven 将始终为给定的 groupId 和 artifactId 选择一个版本。

通常您应该尝试使其与较新的版本一起使用。我这是不可能的,你可以考虑使用Maven shade插件进行着色。

【讨论】:

它正在打包......所有的假罐子都在那里...... feign-core-10.2.3.jar feign-form-3.8.0.jar feign-gson-8.18.0。 jar feign-hystrix-10.2.3.jar feign-slf4j-10.2.3.jar feign-core-8.18.0.jar feign-form-spring-3.8.0.jar feign-httpclient-8.18.0.jar feign- okhttp-10.1.0.jar 它也被打包,因为它们来自不同的来源......一个来自 io.github.openfeign,另一个来自 com.netflix.feign 所以它们可能有不同的 groupIds,这就是 Maven 认为它们不同的原因。所以我会尝试排除旧版本,或者如果不可能,尝试对类进行遮蔽。 问题是这两个罐子都需要以一种或另一种形式。我们的代码长期以来一直在使用它,它曾经选择正确的 jar,但突然它开始使用有问题的 jar。与 jboss 类加载优先级有关吗?这就是问题所在。或者任何将一个罐子放在另一个罐子之上的 jboss 属性? 课程重叠就像赌博。我可能工作也可能不工作,最好避免这种情况。

以上是关于当两个 jar 具有相同的类集时,使用 jboss/wildfly 的类加载冲突,如何设置顺序/优先级?的主要内容,如果未能解决你的问题,请参考以下文章

如果两个库的类具有相同的类和包名称以供内部使用

当它们具有不同的列集时,按行组合两个数据帧(rbind)

具有动态数组中堆上元素的类集

Collection类集

Java 基础知识总结 3

Windows 上 JAR 文件中具有相同大小写的文件