java - 当两个 jar 具有相同的类集时,使用 jboss/wildfly 的类加载冲突,如何设置顺序/优先级?
问题描述
我有一个要部署在 jboss/wildfly 上的战争文件。战争在其 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
两者都有一个响应类,但其中一个没有代码所需的特定创建方法。
问题是当 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;
我们怎样才能避免这种情况?
解决方案
Maven 不会将这两个版本都打包feign-core
到 WAR 中,除非 groupId 发生了变化。Maven 将始终为给定的 groupId 和 artifactId 选择一个版本。
通常,您应该尝试使其与较新版本一起使用。我这是不可能的,你可以考虑使用 Maven shade 插件进行着色。
推荐阅读
- r - 无法使用 geom_flags 正确绘制
- design-patterns - Redux/Ngrx 状态/reducer 设计用于处理具有动态字段的状态,除非初始化,否则这些字段可能不存在
- svg - 响应式 SVG,垂直和水平居中,同时保持其纵横比/原始大小
- string - if 语句只为一个字符串值提供 false
- assembly - 获取视频模式列表并在程序集中找到特定模式的最佳方法是什么?奥斯德夫
- elixir - Elixir:更新地图列表中的特定值
- nestjs - nestjs/swagger 如何更改基本身份验证中的默认“用户名”字段
- java - SpringBoot 2.4.* 创建代理时是否仍然实现接口?
- markdown - 在降价文件中使用属性
- java - 具有内部泛型的泛型类的集合