有3个项目。 B取决于A,C取决于A和B.A和B都依赖于版本1的包P,即P1。现在C引入另一个P的反面,命名为P2。
依赖树可能看起来像
P1 P1
^ ^
| |
A <- B
^ ^
\ /
\ /
C -> P2
为了避免P confilict,我决定通过修改A和B中的pom.xml
来修剪P1。但奇怪的是
事情发生了:当我在C中运行mvn eclipse:eclipse
时,我发现它仍然试图解决P1的依赖性!
然后我仔细检查了每个项目。
In A: Re-check the pom.xml -> NO dependency of P1 , it won't resolve P1 !
In B: Re-check the pom.xml -> NO dependency of P1 , it won't resolve P1 !
In C: Re-check the pom.xml -> NO dependency of P1 itself , but it DOES resolve P1!
|
| - Comment out dependency of A: Resolve P1 !
|
| - Comment out dependency of B: Resolve P1 !
|
| - Comment out dependency of both A & B: Won't resolve P1 !
Finally, I make sure that other packages of A , B and C that depend on do not
depend on P1(Actually, P1 is a small SDK with limited usage, I'm sure other
packages won't denpend on it)
所以这是奇怪的事情: 从检查看,似乎A或B引入P1,但分别在A和B中,我检查 并得出结论,两者都不会引入P1。
有什么不对吗?
更新
我终于弄清楚出了什么问题:看看答案。
答案 0 :(得分:1)
我终于弄清楚出了什么问题:
从C中的mvn dependency:tree
,我发现P1存在于B.jar的子级中。所以我去了B并运行mvn clean install
来更新B.jar
,然后回到C,现在一切正常。
我认为可能会发生这种情况:
由于B是项目 - 取决于P1,因此B.jar
中记录B的依赖关系的旧文件(实际上我提取 B.jar 并发现它被称为{{1 }})不会更新为META-INF/maven/path/to/B/pom.xml
中的pom.xml
。因此,当我在C中运行B
时,它会重新启动B(C也是项目依赖于B,因此它解析了B.jar),然后通过脏pom.xml 重新启动P1在mvn eclipse: eclipse
中,而不是B.jar
中的新鲜pom.xml 。我认为这是一个糟糕的设计,容易出现模糊错误!
答案 1 :(得分:0)
尝试在项目C上运行mvn dependency:tree,你应该看到P1的来源。