2016-02-13 68 views
6

的多个版本,我在它的依赖两个罐子叫拉一个Web应用程序:Maven的 - 相同的依赖

  1. 了Javassist-3.9.0.GA.jar
  2. 了Javassist-3.20.0-GA .jar

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

+1

如果你真的有在同一工件的两个版本你'war'你做错了什么......用默认的Maven和Maven的战争插件应该不会有重复的jar文件在你的lib文件夹.... (这听起来像你手动做的事情,应该让Maven做) – khmarbaise

+0

谢谢,如果我使用'包'目标来构建战争文件,是不是使用maven war插件来做到这一点?如果没有,那么Maven-War-plugin有什么不同来“打包”目标呢? –

+0

'package'不是一个目标,它是一个生命周期如果你在你的pom文件中设置了正确的' war'这应该是开箱即用的......最好的办法就是看你正在使用的pom文件。 – khmarbaise

回答

14

对于Java,您提供的类的多个版本无关紧要。默认的类加载器只会选择它可以找到的类路径中的第一个。

既然你可以运行没有错误的应用程序,这意味着执行下列操作之一:

  • 如果Javassist是-3.9.0.GA.jar首先是在类路径:您的应用程序不依赖于新javassist-3.20.0-GA.jar中的API或错误修正您也可以在这些版本之间更改任何API(在不同版本之间不应该这样做)

  • if javassist-3.20.0-GA .jar首先在类路径中:库向后兼容

我建议:

  • 如果这些依赖关系是在应用程序的不同部分的直接依赖,确保你使用到处都是一样的版本。最好的方法是修改父POM的dependencyManagement部分中的版本,然后省略依赖项部分中的版本属性。
  • 如果这些依赖关系是传递依赖关系,那么排除不想使用的依赖关系,以确保在最终应用程序中只有一个版本的库。还要考虑为仍然使用旧版本的项目提出问题,并要求他们升级依赖项的版本。
  • 如果需要使用同一库的两个不兼容的版本,它具有相同的包和类名的工作,可以考虑使用一个模块系统,如OSGi的,它支持运行不同版本的相同库在一定程度上的。
+0

我明白这一点及其对此的合理解释,但这并不意味着应用程序真的处于危险之中,因为如果我有一个依赖于依赖于3.9.0.GA中的类的依赖项并且该类在3.20 .2-GA和3.20.0-GA首先在类路径中,并且依赖性需要3.9.0.GA中该特定类的版本? –

+0

另一个问题是如何找出哪一个是第一个在类路径中? –

+0

你不能找出哪一个是第一个...这是你的应用程序中的一个大问题...你应该修复这个..其他方面你的应用程序可以运行,有时它会失败... – khmarbaise

2

回答“有什么建议如何解决它?”看看Resolving conflicts using the dependency tree。使用命令mvn dependency:tree,您将能够知道任何依赖关系来自哪里。当您知道哪些工件取决于javassist时,您可以添加一个排除项以避免其中一个javassist版本。