如何在 Maven 中强制执行最小传递依赖版本而不降级?

问题描述 投票:0回答:1

在Gradle中,您可以设置依赖约束。它们有 3 大特点:

  1. 如果传递依赖项会较低,则将其升级到指定的最低版本
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-tomcat:2.7.18'
    constraints {
        implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.84' //upgrades 9.0.83->9.0.84 :)
    }
}
  1. 本身可以被其他地方(由父级或 BOM)提供的更高版本覆盖——也就是说,旧的约束是无害的,并且永远不会将包降级到原来的样子
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-tomcat:2.7.18'
    constraints {
        implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.82' // does not downgrade 9.0.83->9.0.82 :)
    }
}
  1. 如果传递依赖项最终没有被任何直接依赖项使用,它将不会包含在您的构建中
dependencies {
//    implementation 'org.springframework.boot:spring-boot-starter-tomcat:2.7.18'
    constraints {
        implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.84' // does nothing :)
    }
}

我希望在 Maven 中复制这些功能。使用

<dependencyManagement>
会选中框 1 和 3,但会降级更高版本,这意味着必须不断清理它。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>2.7.18</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>9.0.82</version> <!-- downgrades 9.0.83->9.0.82 :( -->
            </dependency>
        </dependencies>
    </dependencyManagement>

并且设置版本范围将始终使用该范围内的最高版本

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>2.7.18</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>[9.0.82,)</version> <!-- always uses latest :( -->
            </dependency>
        </dependencies>
    </dependencyManagement>

我想要的结果:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>2.7.18</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>9.0.82</version> <!-- uses 9.0.83 from parent instead :) -->
            </dependency>
        </dependencies>
    </dependencyManagement>
java maven pom.xml dependency-management
1个回答
0
投票

Maven 中没有真正解决这个问题。

您能得到的最好方法是使用强制执行器规则(带有强制执行器插件),该规则在版本降级的情况下会导致构建失败。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.