You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置Maven使其在存在依赖版本冲突时拒绝构建?

无需编写新插件实现Maven依赖冲突时拒绝构建

当然可以做到!不用开发新插件,Maven官方就提供了现成的工具来解决这个问题——maven-enforcer-plugin,它能帮你在检测到依赖版本冲突时直接中断构建,而不是默认悄悄选一个版本继续。

核心原理

利用插件内置的dependencyConvergence规则,这个规则会遍历项目的整个依赖树,检查所有依赖的版本一致性。如果发现同一个依赖存在多个不同版本,就会直接抛出错误并终止构建流程。

具体配置步骤

在你的pom.xml<build> -> <plugins>节点中添加以下配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.4.1</version> <!-- 建议使用官方最新稳定版本 -->
    <executions>
        <execution>
            <id>enforce-dependency-convergence</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <dependencyConvergence/>
                </rules>
                <fail>true</fail> <!-- 开启冲突时直接失败的逻辑,符合你的需求 -->
            </configuration>
        </execution>
    </executions>
</plugin>

效果演示

当你执行mvn package时,如果检测到C依赖同时存在1.0.0和1.5.6两个版本,Maven会立刻抛出类似下面的错误,终止构建:

[ERROR] Rule 0: org.apache.maven.enforcer.rules.dependency.DependencyConvergence failed with message:
Failed to converge on version for dependency 'com.example:C' paths to dependency are:

  • com.example:your-project:1.0.0 -> com.example:A:x.x.x -> com.example:C:1.0.0
  • com.example:your-project:1.0.0 -> com.example:B:y.y.y -> com.example:C:1.5.6

后续处理提示

当你明确要指定某个版本的C(比如最终选择1.5.6),可以通过排除依赖的方式解决冲突,示例如下:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>A</artifactId>
    <version>你的A版本号</version>
    <exclusions>
        <exclusion>
            <groupId>com.example</groupId>
            <artifactId>C</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这样配置后,dependencyConvergence规则就不会再报错,Maven会使用你指定的C版本(这里是B依赖的1.5.6)进行构建。

内容的提问来源于stack exchange,提问作者mac01021

火山引擎 最新活动