ieg*_*gel 3 java jersey gradle maven spring-boot
我有一个非常简单的 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'
}
Run Code Online (Sandbox Code Playgroud)
org.mandas:docker-client:2.0.2对 具有传递依赖org.glassfish.jersey.core:jersey-client:2.28。然而 gradle 然后会拉取 version2.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
Run Code Online (Sandbox Code Playgroud)
似乎spring-boot-starter-web在某种程度上对org.glassfish.jersey.core:jersey-client:2.27. 但是,如果我打印所有依赖项,./gradlew dependencies我不会看到对org.glassfish.jersey.core:jersey-client:2.27from 的依赖项spring-boot-starter-web。
然而,在网上搜索了一下,我发现了另一种追踪依赖关系的方法:
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'
}
Run Code Online (Sandbox Code Playgroud)
这样我就能够追踪到 2.27 版本的引入位置。它似乎在以下 poms 中声明:
我现在的问题是多方面的:
spring-boot-starter-web依赖jersey?我一直有这样的印象:如果我们想明确地使用我们将包含的jersey实现。springspring-boot-starter-jerseyspring-boot-starter-web取决于org.glassfish.jersey.core:jersey-client:2.27运行时./gradlew dependencies。显然,当它降级版本时,必须在某个地方依赖它。jersey.我知道这些是多个问题,但我认为最好在一个问题中提出它们,而不是将它们分散到多个问题中,因为它们都与相同的上下文相关。
顺便说一句:这不仅发生在org.glassfish.jersey.core:jersey-client. 完全相同的事情也适用于org.apache.httpcomponents:httpclient.
感谢您的帮助!
首先,为什么
spring-boot-starter-web要看球衣?我一直有这样的印象:如果我们想明确地使用我们将包含的jersey实现。springspring-boot-starter-jersey
事实并非如此。相反,它取决于 Tomcat。您是正确的,您需要球衣启动器来自动配置它。
为什么我看不到这
spring-boot-starter-web取决于org.glassfish.jersey.core:jersey-client:2.27运行时./gradlew dependencies。显然,当它降级版本时,必须在某个地方依赖它。
因为事实并非如此。下面详细介绍一下。
为什么2.28版本降级到2.27版本?我如何知道 Spring Boot 应用了哪些策略,以便为特定版本做出选择。
这是根本问题。下面我会解释一下。
该应用程序运行得很好,但现在我遇到了版本冲突,我应该如何最好地处理这个问题?仅使用 v2.28 而不是 v2.27 是一个可行的选择吗?我认为这也指的是我关于为什么 spring-boot 实际上使用
jersey.
这取决于。根据我的经验,与构建和测试的依赖项相比,您的依赖项可能会通过升级和降级传递依赖项来破坏,即使它只是一个次要版本(我正在看着您,SnakeYAML!)所以您真的只是尝试一下。通常升级比降级更安全,但有时仍然会导致问题。
这是泽西岛降级的交易。
Spring 依赖管理插件用于控制依赖项的版本,包括直接依赖项和传递依赖项。
当您同时应用依赖管理插件和 Spring Boot 插件时,后者将应用其默认版本,该版本来自 Spring Boot BOM。您可以通过运行来检查管理哪些依赖项以及哪些版本gradle dependencyManagement。
所有这一切的想法是,您获得一组已知可以很好地协同工作的依赖关系。如果您喜欢托管依赖项之一的不同版本,则必须使用dependencyManagement扩展来配置它(如此处所述)。
这就是您的 Jersey 依赖性被降级的原因。
我个人不使用 Spring 依赖管理插件,因为我喜欢在普通 Gradle 中处理依赖项的方式。所以我通常只是做这样的事情:
plugins {
id 'org.springframework.boot' version '2.1.0.RELEASE'
id 'java'
}
dependencies {
implementation platform("org.springframework.boot:spring-boot-dependencies:2.1.0.RELEASE")
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,默认情况下它将使用 Spring Boot BOM 中的依赖项,但如果有人需要更新版本,则不会降级它们。但如果需要,它会升级它们,如果您不想,也不必自己指定版本,在这种情况下,它将使用 BOM 中的版本。
| 归档时间: |
|
| 查看次数: |
2277 次 |
| 最近记录: |