2013-03-06 77 views
0

我在這裏有一點依賴性地獄的情況,我想解決:我有三個項目,A,B和C.A和B都依賴C.現在A是我自己的模塊,我有直接控制以上,B是我使用的一個庫,C是使用兩個直接從我模塊A和我的依賴性B.我可以通過本地存儲庫覆蓋Maven依賴項版本嗎?

爲直觀起見庫:

C 
^
/B 
| ^
\/
    A 

由於種種原因,我現在需要對本地需要的C進行一些小改動,但不希望(或不能)將其部署到正常下載C的全局存儲庫。

我試圖通過標記我裝在我與分類本地資源庫的C修改後的版本,改變依賴於它在A的POM要做到這一點,包括像這樣的分類:

<dependency> 
    <groupId>foo</groupId> 
    <artifactId>C</artifactId> 
    <version>0.7.16</version> 
    <classifier>myclassifier</classifier> 
</dependency> 

mvn dependency:tree現在表明我在類路徑中有因爲傳遞依賴的既與分類版本和版本沒有它:

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ A --- 
[INFO] org.example:A:jar:0.1-SNAPSHOT 
... 
[INFO] +- foo:C:jar:myclassifier:0.7.16:compile 
[INFO] +- bar:B:jar:3.2.5:compile 
[INFO] | +- foo:C:jar:0.7.16:compile 

有什麼辦法,我可以強迫我的項目/ Maven來就用我的修改後的版本在此背景?

編輯:解

現在,我一直在使用它像這樣在排除一個的pom.xml這要歸功於菲利普和Samuel答案解決。

<dependency> 
    <groupId>foo</groupId> 
    <artifactId>C</artifactId> 
    <version>0.7.16</version> 
    <classifier>myclassifier</classifier> 
</dependency> 

<dependency> 
    <groupId>bar</groupId> 
    <artifactId>B</artifactId> 
    <version>3.2.5</version> 
    <exclusions> 
    <exclusion> 
     <groupId>foo</groupId> 
     <artifactId>C</artifactId> 
    </exclusion> 
    <exclusions> 
</dependency> 

注:當然,這僅僅只要在C編輯真的是輕微的,不改變被B所使用的API,這對我來說是這樣的作品。

回答

2

你說的是C是庫的正式版本,你的小變化(我們稱之爲C2)只能被A使用。你也可以說,通過在A中聲明對C2的直接依賴,不幸的是,最終你會得到C2和C. C將是一個來自B的傳遞依賴項。不幸的是,Maven反應器將庫與相同的版本對待,但是與不同的庫具有不同的分類器,給出了這個結果(同時擁有C和C2)。

如果您只需要項目A中的C2,您可以明確地將排除項添加到C到A的POM中。

+0

是的,我只需要C2(這是與C兼容的API/ABI)。我沒有想到排除,這使得它非常容易,非常感謝! – David 2013-03-06 12:12:54

2

顯然這個新版本的C對你來說不是一個新的神器,而是這個神器的一個新的版本

所以你不應該在這裏使用分類器,而是增加一個版本號。

你的項目將與過去的版本構建(即使你有問題要解決的最後一個版本,可以排除在你的POM中的傳遞依賴)

但是,你必須非常小心這樣做的時候這是因爲你的B項目已經與舊版本的C一起編譯了。所以如果你修改了方法擦除或者刪除方法或類,你將會遇到運行時的麻煩。

如果您只在C庫中添加類或方法,那麼它應該可以工作。

相關問題