如何解决maven中这种奇怪的依赖关系?
有3个项目。B依赖于A,C依赖于A和B。A和B都依赖于版本1的包P,即P1。现在,C引入另一个P,命名为P2 独立树可能看起来像如何解决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
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)