Jar从内部部署库中选择了错误的依赖版本



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

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

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

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

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

最新更新