首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven来源依赖版本,而不是我们的父母依赖管理。

Maven来源依赖版本,而不是我们的父母依赖管理。
EN

Stack Overflow用户
提问于 2018-05-04 22:42:35
回答 3查看 746关注 0票数 6

下面显示了我的父母的层次结构。

您可以看到,我们有一个公司的家长-pom的春季启动项目。这个POM具有作为父级的spring启动程序,并导入了我们自己的依赖管理BOM。

代码语言:javascript
复制
[INFO] --- hierarchy-maven-plugin:1.4:tree (default-cli) @ user-service ---
[INFO]  PARENT com.MY_COMPANY.platform:user:3.20.14-SNAPSHOT
[INFO]    PARENT com.MY_COMPANY.platform:spring-boot-parent:3.20.12-SNAPSHOT
[INFO]      PARENT org.springframework.boot:spring-boot-starter-parent:1.5.12.RELEASE
[INFO]        PARENT org.springframework.boot:spring-boot-dependencies:1.5.12.RELEASE  <<<< This pom defines assertJ 2.x
[INFO]          [ other imports ]
[INFO]      IMPORT com.MY_COMPANY:dependencyManagementBase:2.23.14-SNAPSHOT     <<<<<<<<<<<< This pom defines assertJ 3.x
[INFO]    IMPORT com.MY_COMPANY.platform:platform-dependency-management:1.20.7
[INFO] ------------------------------------------------------------------------

为了关注特定的问题,我们在依赖项管理中定义了assertJ 3;然而,spring引导依赖项定义了AssertJ 2,AssertJ不是什么大问题,但是还有其他的鱼,比如Mongo驱动程序,它们没有选择我们的版本。

Maven在这里是如何选择优先级的?为什么我们的依赖管理不能赢得一个远祖的依赖管理?

我还注意到,如果我将AssertJ添加为_COMPANY.Platform:spring parent的依赖项,那么它也不会在我们的依赖关系管理中使用该版本(所以我现在只保留它,这样显微镜下的层次结构就更短了)。

编辑-添加缩写POMs

com.MY_COMPANY.platform:spring-boot-parent

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.MYCOMPANY.platform</groupId>
    <artifactId>spring-boot-parent</artifactId>
    <version>3.20.12-SNAPSHOT</version>
    <packaging>pom</packaging>

    <prerequisites>
        <maven>3.0.4</maven>
    </prerequisites>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.12.RELEASE</version>
    </parent>

    <properties>
        <MYCOMPANYdependencymanagement.version>2.23.13</MYCOMPANYdependencymanagement.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.MYCOMPANY</groupId>
                <artifactId>dependencyManagementBase</artifactId>
                <version>${MYCOMPANYdependencymanagement.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

com.MY_COMPANY:dependencyManagementBase

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.MYCOMPANY</groupId>
    <artifactId>dependencyManagementBase</artifactId>
    <version>2.23.13</version>
    <packaging>pom</packaging>

    <modules>
        <module>spring-dep-man</module>
    </modules>

    <properties>
        <org.assertj-core.version>3.5.2</org.assertj-core.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.assertj</groupId>
                <artifactId>assertj-core</artifactId>
                <version>${org.assertj-core.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

**编辑2-添加显示不同版本的详细层次结构**

代码语言:javascript
复制
~/p/springbootparentpom> mvn hierarchy:tree -Dlevel=full
[INFO] --- hierarchy-maven-plugin:1.4:tree (default-cli) @ spring-boot-parent ---
[INFO] Displaying hierarchy.
[INFO]  PARENT org.springframework.boot:spring-boot-starter-parent:1.5.12.RELEASE
[INFO]    PARENT org.springframework.boot:spring-boot-dependencies:1.5.12.RELEASE
[INFO]          DEP_MANAGEMENT ........
[INFO]          DEP_MANAGEMENT org.assertj:assertj-core:2.6.0
[INFO]          [ ... Many DEP_MAN and IMPORT ... ]
[INFO]  IMPORT com.MYCOMPANY:dependencyManagementBase:2.23.14-SNAPSHOT
[INFO]        DEP_MANAGEMENT ........
[INFO]        DEP_MANAGEMENT org.assertj:assertj-core:3.5.2
[INFO]        DEP_MANAGEMENT ........
EN

回答 3

Stack Overflow用户

发布于 2018-05-04 23:24:47

我猜它是在抢最近的船。

依赖中介--这决定了当遇到多个工件版本时,将使用哪个版本的依赖项。目前,Maven 2.0只支持使用“最近的定义”,这意味着它将使用依赖树中与项目最接近的依赖项的版本。始终可以通过在项目的POM中显式声明版本来保证版本。请注意,如果两个依赖版本在依赖树中处于相同的深度,直到Maven 2.0.8为止,还没有定义哪个版本会获胜,但是由于Maven 2.0.9,声明中的顺序才是重要的:第一个声明获胜。

对于这样的事情,我所做的就是访问给定项目的IDE依赖项部分。它向我展示了所有的依赖关系,什么版本,以及它来自哪里(参见下面附加图像的底部弹出)。

票数 1
EN

Stack Overflow用户

发布于 2018-05-08 20:47:55

问题是,您的项目不是依赖父项目进行依赖关系管理,而是依赖于导入的项目。Maven依赖关系层次结构不是这样工作的。最好的解决方案可能是将‘父spring-启动-启动器-父’声明移到MY_COMPANY:dependencyManagementBase项目中。然后将com.MYCOMPANY.platform中的父声明更改为指向您的dependencyManagementBase项目。这样,您将有一个明确的继承层次结构。

您目前所拥有的并不真正使用依赖关系管理。也就是说,如果要将dependencyManagementBase项目中的“dependencyManagementBase”部分更改为“依赖”,则会得到相同的结果。

票数 1
EN

Stack Overflow用户

发布于 2018-05-08 20:52:12

似乎没人知道答案。所以我就用我的发现来回答。

假设OP不起作用。我的下一个策略是导入spring启动父母和spring启动依赖项POMs,因为我不能使用它们作为父母。

然而,这有它自己的行为。

我发现,如果我的依赖关系管理像这样,我的版本就赢了:

代码语言:javascript
复制
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>dependency-management-slim</artifactId>
            <version>2.23.14-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然而,我决定将我的自定义代码与我的春季启动模拟pom分开。所以为了保持优先权,我想我必须这样做:

代码语言:javascript
复制
service-root -> only import my-dependency-management
^-- spring-boot-parent -> mimick and import spring-boot-starter-parent
^-- service-parent -> has our common dependencies and profiles
^-- service-impl - code

但是,这不起作用;spring引导版本压倒了我们的自定义版本。所以我不得不这么做:

代码语言:javascript
复制
root-parent -> nothing
^-- spring-boot-parent -> mimick and import spring-boot-starter-parent
^-- service-parent -> import my-dependency-management
^-- service-impl - code

结论

  • 如果在同一个pom中导入多个依赖项管理,那么第一个管理版本将获胜。
  • 如果您要导入的是多个,那么最后一个导入的就赢了。
  • 如果父定义的具有定义了单个依赖项的依赖管理,则不能用依赖关系管理覆盖它们(这是最初的问题)。

¯\_(ツ)_/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50183956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档