Java / Maven如何使用使用项目中已使用的另一个依赖项的旧版本的依赖项

Posted

技术标签:

【中文标题】Java / Maven如何使用使用项目中已使用的另一个依赖项的旧版本的依赖项【英文标题】:Java/Maven how to use a dependency that uses an older version of another dependency that is already used in the project 【发布时间】:2021-12-30 15:17:05 【问题描述】:

在我的项目中,我们使用 2.9.0 版的 jackson-databind。 我想使用 maven 依赖项 (https://github.com/Jaspersoft/jrs-rest-java-client),但它需要使用旧版本的 jackson-databind,因为在更新的版本中,它们删除了依赖项调用的方法(例外“ NoSuchMethod”被提出)。

在这种情况下该怎么办?显然我不能为了满足这个唯一的依赖而降级我们在项目中使用的 jackson-databind 版本。

有没有办法在我的项目中继续使用最新版本,但让需要旧版本的依赖项使用旧版本?在我看来,这将是一个完美的解决方案,但我觉得它不会那样工作。

【问题讨论】:

版本是多少?具体是什么方法? 是否可以选择创建固定版本的麻烦工件? @chrylis-cautiouslyoptimistic- 我不知道具体是什么版本,我只知道是这个方法:github.com/FasterXML/jackson-databind/blob/…,但是我正在使用的库中的代码试图调用这个方法,除了只有一个参数(现在有两个),该版本的方法不再存在(因此抛出 NoSuchMethod)。 @ThorbjørnRavnAndersen 我想避免做这样的事情,我需要把那个罐子放在代码库中,不是很干净,技术领导者会对我皱眉 @genku 如果麻烦的 jar 没有更新版本并且您不想正确修复它,那么除了将您的代码拆分为单独的应用程序之外,我没有其他可靠的选择。 【参考方案1】:

看看 Maven Shade 插件:http://maven.apache.org/plugins/maven-shade-plugin/index.html

它允许你重命名一个版本的包

【讨论】:

我不确定如何使用它来解决我的问题,你能解释一下吗?【参考方案2】:

即使您找到了一个解决方案,可以在您的项目中包含相同依赖项的两个版本。您仍然有问题,当在一个 JVM 中运行应用程序时,类加载器将不知道现在需要哪个版本的类,因此它将加载并提供在类加载器层次结构中找到的第一个类。所以你不能在同一个 ClassLoader 中使用一个 Class 的两个 Version。

【讨论】:

以上是关于Java / Maven如何使用使用项目中已使用的另一个依赖项的旧版本的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Idea中maven项目pom文件中已引入testng但项目文件中无法引入@Test

在maven中引用其他项目作为jar包,pom文件中已成功,但会报出如图的问题,请问怎么解决?

如何使用Maven构建Java项目?Maven的使用详细解读

如何在 Netbeans 中创建 Java 项目,而不使用 Maven 作为默认值?

如何将Maven项目转换为普通的Java项目?

如何使用 GitHub 中的 Maven 从 NetBeans 项目迁移到 Java CI?