2012-10-18 83 views
0

有3個項目。 B取決於A,C取決於A和B.A和B都取決於版本1的包P,即P1。現在C介紹P的另一個版本,將其命名爲P2。如何在maven中解決這個奇怪的依賴關係?

的denpendency樹可以看起來像

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

爲了避免P confilict,我決定修剪P1,通過修改A和B的pom.xml但發生奇怪的
的事情:當我用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。

有什麼問題嗎?

UPDATE

我終於弄清楚什麼是錯的:一看便知。

+0

我不知道如何處理這個沒有更多的細節。 'dependency:tree'的輸出是什麼? –

+0

建立在命令行上嗎? mvn清潔包嗎? – khmarbaise

+0

對於理解類路徑,Eclipse是一個糟糕的IDE。一些其他的IDE,例如IntelliJ和NetBeans有更好的處理不同類路徑的能力。測試與代碼等等。所以你可能會遇到Eclipse本身的問題,而不是Maven問題。我會建議在其他IDE中檢查類路徑,以確認你正在做你認爲正在做的事。我知道IntelliJ會在我自己使用它的時候給出正確的類路徑,而且我可以肯定地告訴NetBeans也一樣。 –

回答

0

嘗試在項目C上運行mvn dependency:tree,你應該看到P1來自哪裏。

+0

這是一條評論,而不是答案。 –

+0

@Dave牛頓,我回答了。 – larmbr

+0

@larmbr是的,我知道:) –

1

我終於弄清楚什麼是錯的:

從用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是不是更新爲pom.xmlB呢。所以當我在C中運行mvn eclipse: eclipse時,它改變了B(C也是項目在B上的縮寫,所以它解析了B.jar),然後P1將P1改爲B.jar,而不是新鮮pom。 xml in B)。我認爲這是一個糟糕的設計和模棱兩可的錯誤!