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

如何解决maven中这种奇怪的依赖关系?,maven,Maven,有3个项目。B依赖于A,C依赖于A和B。A和B都依赖于版本1的包P,即P1。现在,C引入另一个P,命名为P2 独立树可能看起来像 P1 P1 ^ ^ | | A <- B ^ ^ \ / \ / C -> P2 这就是奇怪的事情: 从检查中,似乎A或B引入P1,但在A和B中,我分别检查 并得出结论,两者都不会引入P1 有什么问题吗 更新 我终于找出了问题所在:查看答案。尝试在项目C上运行mvn depen

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

独立树可能看起来像

  P1   P1
  ^     ^
  |     |
  A  <- B
  ^     ^
   \   /
    \ /
     C -> P2
这就是奇怪的事情: 从检查中,似乎A或B引入P1,但在A和B中,我分别检查 并得出结论,两者都不会引入P1

有什么问题吗

更新


我终于找出了问题所在:查看答案。

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

我终于找出了问题所在:

在C中的
mvn dependency:tree
中,我发现P1存在于B.jar的子级中。所以我去了B,运行了
mvn clean install
来更新
B.jar
,然后回到C,现在一切都好了

我认为可能会发生这样的情况:


由于B是依赖于P1的项目,因此
B.jar
中记录B的依赖关系的旧文件(实际上我提取了B.jar并发现它被称为
META-INF/maven/path/to/B/pom.xml
不会像
B
中的
pom.xml
那样更新。因此,当我在C中运行
mvn eclipse:eclipse
时,它解析B(C也是B上的项目,因此它解析B.jar),然后B.jar通过
B.jar
中的脏pom.xml解析P1,而不是
B
中的新鲜pom.xml)。我认为这是一个糟糕的设计和含糊不清的错误倾向

如果没有更多的细节,我不知道如何处理这个问题。依赖关系树的输出是什么?基于命令行的构建可以工作吗?mvn clean package?就理解类路径而言,Eclipse是一个糟糕的IDE。其他一些IDE,例如IntelliJ和NetBeans,具有更好的能力来处理不同的类路径,例如测试与代码等。因此,有可能您遇到的是Eclipse本身的问题,而不是Maven问题。我建议检查其他IDE中的类路径,以验证您正在做您认为您正在做的事情。我知道IntelliJ会在我自己使用时给出正确的类路径,而且我可靠地告诉过NetBeans也会给出正确的类路径。请回答您发现了什么以及您是如何解决这个问题的。然后将其标记为回答。@Nishant查看我的更新。这是一条评论,不是回答。@Dave Newton,我回答了它。这是一个回答,它解决了larmbr的问题。这是解决这个问题的正确第一步。
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)