2016-04-29 95 views
1

最近我已經加入了Ban Transitive Dependencies plugin到我的pom.xml如下圖所示:'BanTransitiveDependencies失敗'背後的原因是什麼?

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
      <id>enforce-banned-dependencies</id> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
      <configuration> 
       <rules> 
        <banTransitiveDependencies> 
         <excludes> 
          <!-- the rule will not fail even if it detects ignoredArtifact 
           of group org.apache.maven, because it is excluded --> 
         </excludes> 
         <includes> 
         </includes> 
        </banTransitiveDependencies> 
       </rules> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

當我嘗試建立我的應用程序使用Maven,我會收到以下錯誤:

[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanTransitiveDependencies failed with message: 

    org.hamcrest:hamcrest-all:jar:1.2:test has transitive dependencies: 
     commons-lang:commons-lang:jar:2.6:test 

我不是當然我明白這裏發生了什麼。爲什麼禁止傳遞依賴失敗?

通過我在的pom.xml以下依賴性方式:

<dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.4</version> 
    </dependency> 

所以我應該改變hamcrest,所有的版本?還是應該將commons-lang 2.6添加到我的pom.xml中?

您能否解釋一下什麼是「禁止傳遞依賴」的正確方法?

+0

順便說一句,你對org.hamcrest:hamcrest全:罐子:1.2?版本1.2 [不可用](http://mvnrepository.com/artifact/org。hamcrest/hamcrest-all)顯然 –

+0

@ A.DiMatteo http://repository.ow2.org/nexus/content/repositories/ow2-legacy/org/hamcrest/hamcrest-all/1.2/ –

回答

1

banTransitiveDependencies規則用於驗證您的項目不會繼承不需要的傳遞依賴項。您可以通過以下方式對其進行配置:

  • <excludes>:要忽略的依賴項列表。
  • <includes>:要考慮的依賴關係列表。這些是<excludes>配置的例外情況。

默認情況下,它不包含任何內容,表示默認情況下禁止所有傳遞依賴項。在默認情況下排除任何內容幷包括所有內容之間存在細微差別。關鍵是你應該以全局的方式定義你想排除的內容,並在那個子集中定義你想要包含的內容。

這就是爲什麼,在你的例子中,構建失敗:你有默認的地方沒有排除任何東西,你有一個傳遞依賴commons-lang:commons-lang:jar:2.6

從文檔的例子解釋說:

<excludes> 
    <!-- the rule will not fail even if it detects ignoredArtifact 
    of group org.apache.maven, because it is excluded --> 
    <exclude>org.apache.maven:ignoredArtifact</exclude> 
    <exclude>*:anotherIgnoredArtifact</exclude> 
</excludes> 
<includes> 
    <!-- override "org.apache.maven:ignoredArtifact" to fail 
    if exactly 1.0 version of ignoreArtifact is detected 
    to be transitive dependency of the project --> 
    <include>org.apache.maven:ignoredArtifact:[1.0]</include> 
</includes> 

在這種配置中,他們想禁止的org.apache.maven:ignoredArtifact 1.0版本傳遞。

所以他們重新定義<excludes>使得所有傳遞依賴匹配org.apache.maven:ignoredArtifact被排除在外,即具有的org.apache.maven組ID和工件ID的ignoredArtifact(這意味着與這些ID所有版本)中的所有依賴關係。然後,他們重新定義<includes>,以便只有org.apache.maven:ignoredArtifact的版本1.0被禁止。

+0

所以在我的情況下,我應該在include標籤中添加commons-lang:commons-lang:jar:2.6? –

+0

@KorayTugay問題是你想禁止什麼? :)如果你想禁止'commons-lang:commons-lang:jar:2.6',那麼你需要具有與我的答案相同的配置,而是使用這些座標。 – Tunaki

+0

我不明白的是,除了2.6,在這種情況下還有什麼其他選擇?我的意思是除2.6以外我想禁止什麼? –

1

BanTransitiveDependencies規則將在構建中包含一個依賴關係的依賴項(即傳遞依賴項)時觸發。

爲了避免這樣的警告,你必須在org.hamcrest:hamcrest-all:1.2聲明你的依賴時要排除commons-lang:commons-lang:jar:2.6

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.2</version> 
    <scope>test</scope> 
    <exclusions> 
    <exclusion> 
     <artifactId>commons-lang</artifactId> 
     <groupId>commons-lang</groupId> 
    </exclusion> 
    </exclusions> 
</dependency> 
+0

啊我明白了..明確的答案,謝謝。但是,如果hamcrest--所有都不適合commons-lang 3.4,會發生什麼? –

+0

@KorayTugay問題是,你想禁止什麼?正如我在[我的回答](http://stackoverflow.com/a/36933426/1743880)中所解釋的,正確的方法是排除某些內容以覆蓋不包括任何內容的默認設置,並在排除的內容中包含某些內容。 – Tunaki

+0

@KorayTugay @Tunaki說,你決定選擇哪個庫。 如果你想避免某個特定的依賴項,[禁止依賴規則](https://maven.apache.org/enforcer/enforcer-rules/bannedDependencies.html)可能更適合。例如,你使用的是Spring Framework,但不想擁有'commons-logging',因爲你正在使用slf4j。 – Kolargol00

相關問題