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

我有一个要部署在 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 文件的顺序/优先级是什么?如果类加载器选择第一个 jar,则会抛出错误,否则会正常工作。

在第一种情况下它会抛出这个错误:

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

我们如何避免这种情况?

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

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

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

本文链接:https://www.f2er.com/2845.html

大家都在问