' BanTransitiveDependencies失败'背后的原因是什么?

时间:2016-04-29 08:12:21

标签: java maven dependencies

最近我已将Ban Transitive Dependencies plugin添加到我的pom.xml中,如下所示:

<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-all的版本?或者我应该将commons-lang 2.6添加到我的pom.xml中?

请问你能解释什么是禁止传递依赖的正确方法&#34; ?

2 个答案:

答案 0 :(得分:2)

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的所有传递依赖项,即所有依赖项的组ID为org.apache.maven且工件ID为​​ignoredArtifact(这意味着所有带有这些ID的版本)。然后,他们重新定义<includes>,以便仅禁止org.apache.maven:ignoredArtifact版本1.0。

答案 1 :(得分:1)

只要您的某个依赖项的依赖项(即传递依赖项)包含在构建中,BanTransitiveDependencies规则就会触发。

为了避免出现此警告,您必须在声明对commons-lang:commons-lang:jar:2.6的依赖时排除org.hamcrest:hamcrest-all:1.2

<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>