【发布时间】:2017-01-17 14:56:47
【问题描述】:
这很烦人。我有 2 个项目,项目 A 和 B,B 依赖于 A 作为 JAR 文件。所以A中的第三个库X依赖于另一个第三方库Y,问题是maven将项目A中的Y解析为一个版本,但在项目B中解析为另一个版本,比如以下:
commons-beanutils:jar:1.9.2 vs. commons-beanutils:jar:1.8.0
并且下面的版本在项目A中指定:
net.sf.json-lib:json-lib:jar:jdk15:2.4
在项目B的POM.xml中,实际上并没有任何明确指定的依赖版本。
在项目A:
[INFO] +- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile
[INFO] | +- commons-beanutils:commons-beanutils:jar:1.9.2:compile
[INFO] | +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] | \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
在项目B 中,由于A,只引入了对Y 的依赖:
[INFO] +- A.jar
[INFO] | +- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile
[INFO] | | +- commons-beanutils:commons-beanutils:jar:1.8.0:compile
[INFO] | | +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] | | \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
理想的解决方案是只在项目B 中更改pom.xml 以解决重复版本依赖地狱。任何想法?谢谢!
是否可以让项目B 继承A.jar 的依赖项而不是引入自己的依赖项。
编辑
最后我发现了一些有用的东西,所以我把它放在这里以防以后有人可能会遇到同样的问题。
关键是将项目A附带的依赖项放入排除项中,因此maven不会只使用项目A中定义的库版本,而是根据当前上下文计算出一个版本。下面是例子:
<dependency>
<groupId>com.wonderland</groupId>
<artifactId>project-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</exclusion>
<!-- ... everything else to be excluded -->
<exclusions>
</dependency>
【问题讨论】:
-
有什么问题? Maven 似乎在这里按预期行事,即通过使用 POM 中声明的版本来解决冲突。
-
问题是两个版本的依赖最终都在战争中。我知道这两个项目可以共享一个 BOM 来解决差异,但不幸的是,这不是一个选项。
-
哪场战争?它的 POM 是什么?在
WEB-INF/lib中不能有重复项。 -
能否请您显示整个依赖关系树?在后台必须有某种依赖调解。 commons-beanutils 可能也在其他一些(传递)点被引用。
-
感谢您的建议。整个 POM.xml 很长。在上面添加了更多信息以显示上下文。
标签: java maven duplicates dependencies