【发布时间】:2020-03-15 04:56:02
【问题描述】:
我有一个非常简单的 springboot 应用程序用于测试目的。
这是我的 build.gradle:
plugins {
id 'org.springframework.boot' version '2.1.0.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mandas:docker-client:2.0.2'
}
org.mandas:docker-client:2.0.2 对org.glassfish.jersey.core:jersey-client:2.28 具有传递依赖。然而 gradle 然后拉版本 2.27 而不是 2.28。
如果我运行./gradlew dependencyInsight --dependency org.glassfish.jersey.core:jersey-client,我会得到以下输出:
org.glassfish.jersey.core:jersey-client:2.27 (selected by rule)
...
org.glassfish.jersey.core:jersey-client:2.27
\--- org.glassfish.jersey.connectors:jersey-apache-connector:2.27
\--- org.mandas:docker-client:2.0.2 (requested org.glassfish.jersey.connectors:jersey-apache-connector:2.28)
\--- compileClasspath
org.glassfish.jersey.core:jersey-client:2.28 -> 2.27
\--- org.mandas:docker-client:2.0.2
\--- compileClasspath
似乎spring-boot-starter-web 在某种程度上依赖于org.glassfish.jersey.core:jersey-client:2.27。但是,如果我使用 ./gradlew dependencies 打印所有依赖项,我看不到来自 spring-boot-starter-web 的对 org.glassfish.jersey.core:jersey-client:2.27 的依赖项。
然而,在网上搜索了一下,我发现了另一种追踪依赖项的方法:
grep -r "2.27" ~/.gradle/caches/modules-2/files-2.1/*
像这样,我能够追踪到 2.27 版的引入位置。它似乎在以下 poms 中声明:
- spring-boot-dependencies-2.1.0.RELEASE.pom
- spring-boot-autoconfigure-2.1.0.RELEASE.pom
我现在的问题是多方面的:
- 首先,为什么
spring-boot-starter-web依赖jersey?我一直认为,如果我们想明确地使用jersey而不是spring实现,我们将包括spring-boot-starter-jersey。 - 为什么我在运行
./gradlew dependencies时看不到spring-boot-starter-web依赖于org.glassfish.jersey.core:jersey-client:2.27。显然,它在降级版本时必须在某处依赖它。 - 为什么 2.28 版本降级到 2.27 版本?我如何知道 Spring Boot 应用了哪个策略以便为特定版本做出选择。
- 应用程序运行良好,但现在我遇到了版本冲突,我应该如何最好地处理这个问题?仅使用 v2.28 而不是 v2.27 是否可行。我想这也指的是我第一个回答为什么 spring-boot 实际上使用
jersey。
我知道这是多个问题,但我认为最好在一个问题中提出这些问题,而不是将它们分散到多个问题上,因为它们都与相同的上下文相关。
顺便说一句:这不仅发生在org.glassfish.jersey.core:jersey-client 上。同样的事情也适用于org.apache.httpcomponents:httpclient。
感谢您的帮助!
【问题讨论】:
标签: java maven spring-boot gradle jersey