Jar 从本地库中选择错误的依赖版本

Posted

技术标签:

【中文标题】Jar 从本地库中选择错误的依赖版本【英文标题】:Jar picks wrong dependency version from on-premise lib 【发布时间】:2021-12-22 22:33:45 【问题描述】:

我有一个系统,其中构建模块并将其部署到系统中。所有 jar 都位于该系统的 lib 文件夹下。我的 jar 依赖于 2.0 版的 commons-io,其他模块也依赖于 1.1 版的 commons-io。因此,两个版本都部署到 lib 文件夹。有一种方法存在于 2.0 中,但不存在于 1.1 中。当我运行我自己的 jar 时,它会选择旧版本 1.1,它会导致 NoSuchMethodError。我正在使用 Maven。有没有办法强制我的模块使用我在 pom.xml 中设置的版本?我不能要求其他模块维护者进行版本更改,因为这个库是第 4 级传递依赖。

【问题讨论】:

【参考方案1】:

如果您在 lib 文件夹中有同一个 JAR 的两个不同版本并将整个 lib 文件夹加载到类路径中,那么您正在玩轮盘赌。

JVM 可能会选择一个或另一个版本,虽然在理论上,您可能可以找出规则,但在实践中,它只是不稳定。

那么,你能做什么?一些替代方案:

从 lib 文件夹中删除 1.1 版本,然后查看其他模块是否也使用 2.0 运行(通常,版本升级或多或少兼容) 使用两个不同的 lib 文件夹,或为两个 JAR 手动构建类路径。仅当它们不在同一个 JVM 中运行时才有可能。 使用 maven shade 插件将所需的库隐藏到您自己的 JAR 中。 commons-io 的大部分内容现在已经过时,因为足够的类/方法已经是 JDK 的一部分(从 Java 8 开始)。因此,您也许可以从项目中删除 commons-io,并使用 Java 本身进行文件处理。

【讨论】:

以上是关于Jar 从本地库中选择错误的依赖版本的主要内容,如果未能解决你的问题,请参考以下文章

maven依赖冲突

如何强制 IntelliJ 中的 Maven 从本地 .m2 存储库中提取特定依赖项

Nexus 存储库中 Jar 版本的简要说明

SpringBoot 添加本地 jar 文件

maven中怎么添加jar包不生效

gradle 解决重复依赖