2014-01-14 97 views
0

我使用兩個罐子A和B. B是一個庫,A有類庫,它使用庫B中的一些舊類。現在,當我將兩個罐子包含在我的項目類路徑中時,這會導致我出現問題,因爲它們都是相同的兩個班的名字,但其中一個比另一個老,行爲不同。用maven解決jar地獄?

我發現這個問題的一個解決方案是首先將庫B導入到Eclipse中,然後單擊確定並且構建項目。然後我添加jar A.這樣,我現有的所有代碼都將使用B的新版本,並且A的類將不變。

但是現在我想爲我的項目使用Maven,但我無法知道如何使用Maven再次製作這個技巧。請幫忙。

+0

沒有'jar地獄'與maven :)但你的舊配置像'jar地獄'解決方案臭。 – MariuszS

+1

@MariuszS好吧,但它是一種更好的地獄。 –

+0

它在哪裏? :)有了maven,只有一個罐子可能。 – MariuszS

回答

0

問題是非常真實的(除非我)。 如果您檢測到存在衝突的庫,則可以使用exclusions來防止您不需要的導入庫。 如果你不知道什麼是衝突的庫,在eclipse中使用默認的maven插件,你可以打開pom文件,並選擇右欄中的「依賴層次結構」選項卡,你可以看到你項目的所有已解決的依賴關係,留下什麼庫導入每個依賴項。

我希望它能幫助你。

+1

這是關於類衝突,而不是依賴衝突。 Eclipse劑量從jar讀取依賴關係。 – MariuszS

3

也許你可以通過重新命名你不想要的類的包來解決你的問題。

您可以通過使用Maven Shade Plugin

做這個插件允許在編譯重命名包名。

用法:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
      </goals> 
     <configuration> 
       <relocations> 
        <relocation> 
          <pattern>com.example.package.name.YourClass</pattern> 
           <shadedPattern>com.example.rename.package.name.YourClass</shadedPattern> 
        </relocation> 
       </relocations> 
        <promoteTransitiveDependencies>true</promoteTransitiveDependencies> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 
1

這不一定是一個Maven問題。默認的類加載器將根據類路徑上的jar的順序來搜索類。當你將jar添加到Eclipse中時,你會這樣做,它們的順序會確保加載正確的類 - 具體來說B在A之前出現在類路徑中,因此,當同一個類在兩個jar中時,它將被加載來自B.

從Maven 2.0.9版開始,類路徑是根據POM中依賴關係的順序構建的。所以,提供依賴關係B在依賴關係A之前聲明,你應該得到和Eclipse一樣的行爲。

不用說,以這種方式依靠類路徑順序是相當脆弱的,我個人認爲如果可能的話清理罐子。

+0

清理瓶子是不可能的 –

+0

然後確保在pom中有非常明確的註釋,表明依賴關係的順序很重要,以防萬一有人覺得在整個過程中進行整理和重新排序。 –