最近我已将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; ?
答案 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>