我使用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的版本。
情況下,像上面說的一個結了很多排除提高對這種做法兩個問題:
- 在上面的例子,爲什麼我必須手動排除JUnit和JMock的?這兩個依賴在the elasticache-java-cluster-client pom.xml中被標記爲
<scope>test</scope>
,所以我希望它們不會包含在我從maven獲得的jar中。 - 儘管我一直在服用更新版本的依賴項的做法似乎已經奏效,但恐怕這些日子裏我會打破某些東西。有沒有更好的方法來確定保留哪個版本的依賴關係?
嗨,你能提供你使用的插件版本。一般來說,它不會添加標記爲範圍測試的庫。有沒有其他的一些情況在您的pom中沒有標記爲範圍測試?依賴項部分的排除機制,用於解決您的依賴關係而不是陰影插件的Maven反應器。因此,通過在依賴項中定義排除項,您只需向Maven指明要考慮哪些依賴項,哪些不依賴項。另一方面,如果您想控制(過濾)插件的依賴關係和包含,您需要在插件上提供配置 – javapapo
請參見[這裏](https://maven.apache.org/plugins/maven-shade -plugin/examples/includes-excludes.html#)爲陰影插件配置 – javapapo
我使用maven-shade-plugin的2.3版本。 我熟悉maven-shade-plugin配置,並且已經按照鏈接頁面上的建議進行了設置。 我的問題是關於人們在選擇要添加哪些排除項時通常會採取的策略,而不是如何首先添加排除項。 – MusikPolice