java - 如何在我的 Maven 项目中只禁止一种传递依赖?

标签 java maven dependencies

我目前正在尝试的是:

<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>
                            <exclude>*:*:*</exclude>
                        </excludes>
                        <includes>
                            <include>commons-lang:commons-lang:2.4</include>
                        </includes>
                    </banTransitiveDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

我上面尝试的意图是:

Exclude banning all transitive dependencies, except commons-lang:2.4

当我尝试时

mvn verify

我会得到

[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-banned-dependencies) @ ebtam-core ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

这不好。因为我知道我的项目中有以下依赖项:

[INFO] +- org.apache.velocity:velocity:jar:1.6.2:compile
[INFO] |  +- commons-lang:commons-lang:jar:2.4:compile

我做错了什么?

最佳答案

我没有看到这个记录在哪里,但问题是在检查 banTransitiveDependency 规则时也会考虑当前的构建 Artifact 。然后,looking at the code ,由于此 Artifact 已被排除,因此它不会检查其依赖项。因此,当您为排除模式指定 * 时,主 Artifact 会匹配该模式,而其余的包含规则将被忽略。因此,以下内容将起作用:

<rules>
    <banTransitiveDependencies>
        <excludes>
            <exclude>commons-lang</exclude>
        </excludes>
        <includes>
            <include>commons-lang:commons-lang:2.4</include>
        </includes>
    </banTransitiveDependencies>
</rules>

但它没有回答您的问题“排除禁止所有传递依赖项,除了 commons-lang:2.4”。

问题是,你为什么首先使用这个规则?它是在 MENFORCER-138 中引入的其目标是迫使开发人员不依赖继承的传递依赖项并强制在 POM 中声明。

您的目标是,如果依赖项 commons-lang:commons-lang:2.4 位于类路径中,则构建失败。因此,您应该使用bannedDependencies规则。默认情况下,它会传递性地搜索依赖项。以下将执行您想要的操作,即仅禁止 commons-lang:commons-lang:2.4:

<rules>
    <bannedDependencies>
        <excludes>
            <exclude>commons-lang:commons-lang:2.4</exclude>
        </excludes>
    </bannedDependencies>
</rules>

关于java - 如何在我的 Maven 项目中只禁止一种传递依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37066129/

相关文章:

java.lang.NoClassDefFoundError : org/apache/poi/hssf/usermodel/HSSFWorkbook 错误

android - 构建 gradle : Could not find method packagingOptions() for arguments root Project "fasterDev"

java - 为什么无法重新打开 TargetDataLine?

java - Spring 启动 : how to use multiple yml files

java - OCR Tesseract - Tess4J 行为怪异

copy - 如何在gradle中复制依赖库JAR

elasticsearch - Spring Data支持的ElasticSearch版本

java - VS Code 是否有针对 Apache Groovy 的语言扩展?

java - 如何从头开始安装这个maven依赖项?

maven - 倾城报告 : no data generated for JUnit framework