如何在maven中解决这种奇怪的依赖?

时间:2012-10-18 09:46:34

标签: maven

有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。

有什么不对吗?

更新

我终于弄清楚出了什么问题:看看答案。

2 个答案:

答案 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的来源。