首页 > 解决方案 > maven 版本在哪里被覆盖?

问题描述

我正在构建一个spring boot starter,遵循推荐的core / autoconfigure / starter模块分离约定。当我查看 Maven 依赖树时,这就是我所拥有的:

[INFO] com.myDomain.myProject:myProject-starter:jar:1.0.8-SNAPSHOT
[INFO] +- com.myDomain.myProject:myProject-autoconfigure:jar:1.0.8-SNAPSHOT:compile
[INFO] |  \- com.myDomain.myProject:myProject-core:jar:1.0.8-SNAPSHOT:compile
[INFO] |     +- io.github.openfeign:feign-gson:jar:9.5.1:compile
[INFO] |     |  +- io.github.openfeign:feign-core:jar:9.5.1:compile
[INFO] |     |  \- com.google.code.gson:gson:jar:2.8.5:compile

gson 在 v2.8.5 中,这是我期望的版本 - 我的项目可以使用它

(注意:在https://mvnrepository.com/artifact/io.github.openfeign/feign-core/9.5.1中,我们看到 gson 的预期版本是 2.5 ......所以不知道为什么我得到 2.8.5 ..)

在我的根 pom.xml 中,我像这样声明 BOM:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-dependencies</artifactId>
            <version>2.0.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在我的“核心” pom.xml 中:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-gson</artifactId>
    </dependency>

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>
</dependencies>

现在,在另一个项目中,我使用启动器。所以我的 pom.xml 非常简单:

<dependencies>
    <dependency>
        <groupId>com.myDomain.myProject</groupId>
        <artifactId>myProject-starter</artifactId>
        <version>1.0.8-SNAPSHOT</version>
    </dependency>
</dependencies>

当我查看这个项目中的依赖树时,我得到了这个:

[INFO] \- com.myDomain.myProject:myProject-starter:jar:1.0.8-SNAPSHOT:compile
[INFO]    +- com.myDomain.myProject:myProject-autoconfigure:jar:1.0.8-SNAPSHOT:compile
[INFO]    |  \- com.myDomain.myProject:myProject-core:jar:1.0.8-SNAPSHOT:compile
[INFO]    |     +- io.github.openfeign:feign-gson:jar:9.5.1:compile
[INFO]    |     |  +- io.github.openfeign:feign-core:jar:9.5.1:compile
[INFO]    |     |  \- com.google.code.gson:gson:jar:2.5:compile

gson 出现在 v2.5 中,因此它不起作用。如果我在 pom.xml 中通过在启动器之前声明 gson 2.8.5 来覆盖它,那么它可以工作..

但是在 Maven 的工作方式中一定有一些我遗漏的东西..

我尝试从本地存储库中删除 1.0.8-snapshot 版本,然后重建它,以确保我的第二个项目没有采用旧版本,但我在构建中不断收到这个不正确的版本,我没有线索它来自哪里/是什么覆盖它。

如果您想在本地尝试一下,此分支中提供了代码:https ://github.com/societe-generale/github-crawler/tree/sprinBoot2upgrade

我真的对任何调查指针感兴趣,了解根本原因,因为我现在很困惑..

谢谢 !

==========================================

编辑 1

正如评论中提到的,它是 Spring Boot 启动器,它将 gson 版本覆盖为 2.8.5(而不是 feign-core 中计划的 2.5)。

所以现在问题变成了:为什么当我在另一个没有父项目的项目中使用启动器作为单一依赖项时,那个被覆盖的版本(2.8.5)消失了,我最终得到了与不兼容的初始版本(2.5) spring-boot-autoconfigure 2.0.4.RELEASE ?

编辑 2

我在这里创建了一个新的、更集中的问题:使用我构建的 Spring Boot 启动器时没有得到预期的版本

标签: mavenspring-bootmaven-3spring-cloudspring-cloud-feign

解决方案


根据问题评论中的各种提示进行快速总结

详细模式自 Maven 3.x 以来已停止使用,因此使用 mvn dependency:tree -X 获取有关使用/覆盖的版本等的更多详细信息。然后你会得到类似的东西:

[DEBUG] io.github.openfeign:feign-gson:jar:9.5.1:compile 
[DEBUG]    com.google.code.gson:gson:jar:2.8.5:compile (version managed from 2.5 by org.springframework.boot:spring-boot-dependencies:2.0.4.RELEASE)

-> 这很清楚地指出了版本的来源,即https://github.com/spring-projects/spring-boot/blob/v2.0.4.RELEASE/spring-boot-project/spring-boot-dependencies /pom.xml#L65


推荐阅读