Maven - 相同依赖的多个版本

Tos*_*far 16 maven maven-dependency

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

  1. Javassist进行-3.9.0.GA.jar
  2. Javassist进行-3.20.0-GA.jar

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

Puc*_*uce 23

对于Java,您提供的类的数量并不重要.默认的类加载器将在它可以找到的类路径上选择第一个.

由于您可以无错误地运行应用程序,这意味着以下之一:

  • 如果javassist-3.9.0.GA.jar是类路径中的第一个:您的应用程序不依赖于javassist-3.20.0-GA.jar中的新API或错误修正.此库中没有使用此库的API(哪个库不应该在次要版本之间做)

  • 如果javassist-3.20.0-GA.jar是类路径中的第一个:库是向后兼容的

我建议:

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


pol*_*iel 6

回答“任何建议如何解决它?” 看看使用依赖树解决冲突。使用该命令,mvn dependency:tree您将能够知道任何依赖项的来源。当您知道哪些工件依赖于 javassist 时,您可以添加排除条目以避免使用 javassist 版本之一。