0

有3个项目。B依赖于A,C依赖于A和B。A和B都依赖于版本1的包P,即P1。现在C引入P的另一个版本,命名为P2。

依赖树可能看起来像

  P1   P1
  ^     ^
  |     |
  A  <- B
  ^     ^
   \   /
    \ /
     C -> P2

为了避免 P 冲突,我决定通过修改pom.xmlA 和 B 来修剪 P1。但是奇怪
的事情发生了:当我mvn eclipse:eclipse在 C 中运行时,我发现它仍然试图解决 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。

哪里不对了?

更新

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

4

2 回答 2

1

我终于弄清楚出了什么问题:

mvn dependency:treeC 中,我发现 P1 存在于 B.jar 的子级别中。于是我跑到 B 跑到mvn clean installupdate B.jar,然后又回到 C ,现在一切正常。

我认为这可能会发生:

由于 B 是依赖于 P1 的项目,因此B.jar其中记录了 B 的依赖关系的旧文件(实际上我提取了 B.jar并发现它被称为META-INF/maven/path/to/B/pom.xml不会pom.xmlinB那样更新。因此,当我mvn eclipse: eclipse在 C 中运行时,它解析 B(C 也是依赖于 B 的项目,因此它解析 B.jar),然后它通过脏 pom.xmlB.jar解析 P1 ,而不是新的pom.xml inB。我认为这是一个糟糕的设计并且容易出现模棱两可的错误!

于 2012-10-19T02:58:26.300 回答
0

尝试在项目 C 上运行 mvn dependency:tree,您应该会看到 P1 的来源。

于 2012-10-18T12:58:35.597 回答