2016-02-10 61 views
4

我使用maven-shade-plugin來創建一個可執行的jar包含我的項目的所有依賴關係。有時候,這些依賴關係會導致自己的依賴關係與其他庫的依賴關係發生衝突,maven-shade-plugin會警告我不確定哪個版本包含在uber jar中。使用maven-shade-plugin時,我應該如何處理依賴衝突?

[WARNING] maven-shade-plugin has detected that some .class files 
[WARNING] are present in two or more JARs. When this happens, only 
[WARNING] one single version of the class is copied in the uberjar. 
[WARNING] Usually this is not harmful and you can skeep these 
[WARNING] warnings, otherwise try to manually exclude artifacts 
[WARNING] based on mvn dependency:tree -Ddetail=true and the above 
[WARNING] output 

一般來說,我這個預警反應是使用依賴性聲明中的<exclusions>元素在我的POM文件從我的項目中刪除有問題的相關性:當我做這個

<!-- Amazon ElastiCache Client --> 
<dependency> 
    <groupId>com.amazonaws</groupId> 
    <artifactId>elasticache-java-cluster-client</artifactId> 
    <version>1.0.61.0</version> 
    <exclusions> 
     <!-- this junit dependency clashes with our test-scoped one and causes integration tests to fail to run --> 
     <exclusion> 
      <groupId>junit</groupId> 
      <artifactId>junit-dep</artifactId> 
     </exclusion> 
     <!-- this dependency brings in two versions of cglib that clash with one another --> 
     <exclusion> 
      <groupId>jmock</groupId> 
      <artifactId>jmock-cglib</artifactId> 
     </exclusion> 
     <!-- newer versions of these dependencies come with dropwizard-core --> 
     <exclusion> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
     </exclusion> 
     </exclusions> 
</dependency> 

,我使用mvn dependency:tree來確保我排除了較低版本的違規依賴,希望最新版本是最成熟和無bug的版本。

情況下,像上面說的一個結了很多排除提高對這種做法兩個問題:

  1. 在上面的例子,爲什麼我必須手動排除JUnit和JMock的?這兩個依賴在the elasticache-java-cluster-client pom.xml中被標記爲<scope>test</scope>,所以我希望它們不會包含在我從maven獲得的jar中。
  2. 儘管我一直在服用更新版本的依賴項的做法似乎已經奏效,但恐怕這些日子裏我會打破某些東西。有沒有更好的方法來確定保留哪個版本的依賴關係?
+0

嗨,你能提供你使用的插件版本。一般來說,它不會添加標記爲範圍測試的庫。有沒有其他的一些情況在您的pom中沒有標記爲範圍測試?依賴項部分的排除機制,用於解決您的依賴關係而不是陰影插件的Maven反應器。因此,通過在依賴項中定義排除項,您只需向Maven指明要考慮哪些依賴項,哪些不依賴項。另一方面,如果您想控制(過濾)插件的依賴關係和包含,您需要在插件上提供配置 – javapapo

+0

請參見[這裏](https://maven.apache.org/plugins/maven-shade -plugin/examples/includes-excludes.html#)爲陰影插件配置 – javapapo

+0

我使用maven-shade-plugin的2.3版本。 我熟悉maven-shade-plugin配置,並且已經按照鏈接頁面上的建議進行了設置。 我的問題是關於人們在選擇要添加哪些排除項時通常會採取的策略,而不是如何首先添加排除項。 – MusikPolice

回答

2

您是否嘗試過將maven-enforcer-pluginDependencyConvergence rule相加?這與我的陰影插件結合使用效果很好。它會告訴你哪些工件引入了相同類的不同版本。它允許我找出我必須排除的東西。

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-enforcer-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>enforce</id> 
        <configuration> 
         <rules> 
          <DependencyConvergence/> 
         </rules> 
        </configuration> 
        <goals> 
         <goal>enforce</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+0

堅實的建議,但它可能對現實世界太嚴格。例如,我的項目依賴於'ru.vyarus:dropwizard-guicey:3.1.1',它依次具有依賴關係收斂錯誤 - 依賴關係之一依次取決於'com.google.inject:guice:3.0',而另外兩個依賴於'com.google.inject:guice:4.0'。 Maven的排除不允許我指定要包含哪些版本的東西,所以我不知道如何解決這個問題。 – MusikPolice