【问题标题】:Maven - why can't I override the version of a dependencyManagement imported pom?Maven - 为什么我不能覆盖依赖管理导入的 pom 的版本?
【发布时间】:2016-03-05 04:03:38
【问题描述】:

我正在寻找关于这个案例的解释:我有一个项目,它有一个 dependencyManagement / dependencies 部分:

myproject/pom.xml:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-parent</artifactId>
            <version>Brixton.M3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>

spring-cloud-starter-parent pom 定义:

<properties>
        <main.basedir>${basedir}/../..</main.basedir>
        <spring-cloud-netflix.version>1.1.0.BUILD-SNAPSHOT</spring-cloud-netflix.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>${spring-cloud-netflix.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

这样,我的项目将获得 spring-cloud-starter-eureka 版本 1.1.0.BUILD-SNAPSHOT。

我期待如果我在 myproject/pom.xml 中添加一个带有另一个版本的属性部分,我会覆盖默认版本,但是它被忽略了,为什么?

myproject/pom.xml

...
<properties>
        <spring-cloud-netflix.version>1.0.0</spring-cloud-netflix.version>
</properties>
...

【问题讨论】:

  • 您是否正确使用了http://repo.spring.io/milestone repo?
  • 是的。问题是我无法覆盖该特定 jar 的版本

标签: java maven


【解决方案1】:

在构建 org.springframework.cloud:spring-cloud-starter-eureka 工件时,属性 spring-cloud-netflix.version 已经被解析,因此您不能在声明依赖项时直接覆盖它。

要正确指定某个依赖版本,您必须在 pom 的依赖管理部分中添加该依赖的版本:

...
<properties>
        <spring-cloud-netflix.version>1.0.0</spring-cloud-netflix.version>
</properties>
...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-parent</artifactId>
            <version>Brixton.M3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>${spring-cloud-netflix.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>

作为多模块构建的最佳实践,您通常会有一个包含依赖管理设置的共享主 pom。所有依赖项的所有版本信息。

【讨论】:

  • 您好 Torsten,感谢您的回答。我的项目已经有一个父 pom 并且可以成功覆盖那里定义的变量。我不明白的是为什么我可以覆盖父项目的dependencyManagement中的变量,而不是myproject的dependency-management-imported pom中的变量。
  • 不能配置依赖的内容,只能在不同版本之间切换。如果你不喜欢父 pom 定义的依赖版本,你必须在你的项目中提供你的依赖的替代版本来覆盖那些。
  • 这本身是一个可以理解的情况,然而,奇怪的是它仍然可以在命令行上覆盖版本,如下所示:-Dspring-cloud-netflix.version=... 一旦你接受了这就是非常不直观的前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2023-02-14
  • 2019-09-17
相关资源
最近更新 更多