Jar 从本地库中选择了错误的依赖版本
Jar picks wrong dependency version from on-premise lib
我有一个系统,其中构建模块并将其部署到系统中。所有 jar 都位于该系统的 lib 文件夹下。我的 jar 依赖于 2.0 版的 commons-io,其他模块也依赖于 commons-io,但依赖于 1.1 版。因此,两个版本都部署到 lib 文件夹中。有个方法2.0有,1.1没有。当我 运行 我自己的 jar 时,它会选择旧版本 1.1,它会导致 NoSuchMethodError。我正在使用行家。有没有办法强制我的模块使用我在 pom.xml 中设置的版本?我不能要求其他模块维护者进行版本更改,因为这个库是第 4 级 t运行sitive 依赖项。
如果您在 lib 文件夹中有同一个 JAR 的两个不同版本,并将整个 lib 文件夹加载到类路径中,那么您就是在玩轮盘赌。
JVM 可能会选择一个或另一个版本,虽然理论上您可以找出规则,但在实践中,它只是不稳定。
那么,你能做什么?一些备选方案:
- 从 lib 文件夹中删除版本 1.1 并查看其他模块 运行 是否也具有 2.0(通常,版本升级或多或少兼容)
- 使用两个不同的 lib 文件夹,或为两个 JAR 手动构建类路径。仅当它们不在同一 JVM 中 运行 时才有可能。
- 使用maven shade插件将需要的库shade到你自己的JAR中。
- 大部分
commons-io
现在已经过时了,因为足够的 classes/methods 已经是 JDK 的一部分(从 Java 8 向上)。因此,您可能只能从项目中删除 commons-io
并使用 Java 本身进行文件处理。
我有一个系统,其中构建模块并将其部署到系统中。所有 jar 都位于该系统的 lib 文件夹下。我的 jar 依赖于 2.0 版的 commons-io,其他模块也依赖于 commons-io,但依赖于 1.1 版。因此,两个版本都部署到 lib 文件夹中。有个方法2.0有,1.1没有。当我 运行 我自己的 jar 时,它会选择旧版本 1.1,它会导致 NoSuchMethodError。我正在使用行家。有没有办法强制我的模块使用我在 pom.xml 中设置的版本?我不能要求其他模块维护者进行版本更改,因为这个库是第 4 级 t运行sitive 依赖项。
如果您在 lib 文件夹中有同一个 JAR 的两个不同版本,并将整个 lib 文件夹加载到类路径中,那么您就是在玩轮盘赌。
JVM 可能会选择一个或另一个版本,虽然理论上您可以找出规则,但在实践中,它只是不稳定。
那么,你能做什么?一些备选方案:
- 从 lib 文件夹中删除版本 1.1 并查看其他模块 运行 是否也具有 2.0(通常,版本升级或多或少兼容)
- 使用两个不同的 lib 文件夹,或为两个 JAR 手动构建类路径。仅当它们不在同一 JVM 中 运行 时才有可能。
- 使用maven shade插件将需要的库shade到你自己的JAR中。
- 大部分
commons-io
现在已经过时了,因为足够的 classes/methods 已经是 JDK 的一部分(从 Java 8 向上)。因此,您可能只能从项目中删除commons-io
并使用 Java 本身进行文件处理。