2016-04-29 97 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

相关问题