Maven - 相同依赖的多个版本

时间:2016-02-13 15:15:36

标签: maven maven-dependency

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

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

2 个答案:

答案 0 :(得分:20)

对于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等模块系统,它支持在某种程度上运行同一库的不同版本。 / LI>

答案 1 :(得分:3)

回答"有关如何修复它的任何建议?"看看Resolving conflicts using the dependency tree。使用命令let result = Double(myInt!) / lutning * M_PI ,您将能够知道依赖性来自何处。当您知道哪些工件依赖于javassist时,您可以添加一个排除条目以避免其中一个javassist版本。