Maven 版本在哪里被覆盖?



我正在构建一个 Spring 启动启动器,遵循建议的核心/自动配置/启动器模块分离约定。当我查看 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 快照版本,然后重建,以确保我的第二个项目没有采用旧版本,但我在我的构建中不断得到这个不正确的版本,我不知道它来自哪里/什么覆盖了它。

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

我对任何调查指针都非常感兴趣,以了解根本原因,因为我现在很困惑。

谢谢!

====

===========================================编辑 1

正如评论中提到的,Spring Boot 启动器将 gson 版本覆盖到 2.8.5(而不是假核中计划的 2.5(。

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

编辑 2

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

基于问题注释中的各种提示的快速摘要

详细模式从 Maven 3.x 开始停止,因此使用 mvn 依赖项: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

最新更新