Maven - 相同依赖的多个版本

Maven - Multiple version of same dependency

我有一个 Web 应用程序,其中的依赖项引入了两个名为:

的 jar
  1. javassist-3.9.0.GA.jar
  2. javassist-3.20.0-GA.jar

当我打包 WAR 时,我在 WEB-INF/lib 目录中有这两个,我的问题是应用程序是 运行 以及为什么我不会遇到任何问题,因为显然我在两个罐子里都有相同的 类,应该有问题吧?

对于 Java,您提供 class 的多少个版本并不重要。默认的 classloader 只会选择它能找到的 classpath 上的第一个。

由于您可以 运行 应用程序没有错误,这意味着以下情况之一:

  • 如果 javassist-3.9.0.GA.jar 首先在 class 路径上:您的应用程序不依赖于 javassist-3.20.0-[ 中的新 API 或错误修复=35=] 此外,您使用的此库的 API 在这些版本之间没有更改(库不应该在次要版本之间更改)

  • 如果 javassist-3.20.0-GA.jar 在 class 路径上第一个:该库向后兼容

我建议:

  • 如果这些依赖项是应用程序不同部分的直接依赖项,请确保您在所有地方都使用相同的版本。最好的方法是在父 POM 的 dependencyManagement 部分修复版本,然后在 dependencies 部分省略版本属性。
  • 如果这些依赖项是传递依赖项,则排除您不想使用的依赖项以确保您在最终应用程序中只有一个版本的库。还可以考虑为仍然使用旧版本的项目提交问题,并要求他们升级依赖项的版本。
  • 如果您需要使用同一库的两个不兼容版本,它们具有相同的包和 class 名称,请考虑使用支持 运行ning 的模块系统,例如 OSGi同一个库在某种程度上的不同版本。

回答"any suggestions how to fix it?"看看Resolving conflicts using the dependency tree。使用命令 mvn dependency:tree 您将能够知道任何依赖项来自何处。当您知道哪些工件依赖于 javassist 时,您可以添加一个排除条目以避免 javassist 版本之一。