这非常烦人。我有2个项目,项目A
和B
,B
依赖于A
作为JAR文件。因此,A中的第3个库X
依赖于另一个第三方库Y
,问题是maven将项目Y
中的A
解析为版本,但是在项目中{ {1}}到另一个版本,如下所示:
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
的POM.xml中,实际上并没有明确指定的依赖项版本。
在项目B
中:
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
而引入Y
的依赖关系:
A
理想的解决方案是只对项目[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
中的pom.xml
进行更改,以解决重复版本依赖地狱问题。任何的想法?谢谢!
是否可以使项目B
继承B
的依赖关系,而不是引入自己的依赖关系。
最后我发现了一些有用的东西,所以我只是把它放在这里,万一有人可能会在以后遇到同样的问题。
关键是将项目A中的依赖项放入排除项中,因此maven不会只使用项目A中定义的库版本,而是根据当前上下文编制一个版本。以下是示例:
A.jar
答案 0 :(得分:1)
让我把要点放在答案中。
B是一场战争,依赖于jar A.所以它继承了A的所有传递依赖。
net.sf.json-lib:json-lib:jar:jdk15:2.4:compile
实际上依赖于commons-beanutils:commons-beanutils:jar:1.8.0:compile
(我查了一下)。因此,您的项目B正确地解决了这种依赖关系(并将其置于战争中)。
项目A的树显示了commons-beanutils对版本1.9.2的依赖性。此版本号必须来自项目A内的其他位置。它可能是dependencyManagement,它可能是其他一些依赖项。追踪版本1.9.2的来源,你知道更多。
在任何情况下,战争只包含版本1.8.0而不是1.9.2,因为在一场战争中你永远不会有两个具有相同groupId / artifactId的工件。