首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle: Springboot覆盖依赖项(jersey和apache )

Gradle: Springboot覆盖依赖项(jersey和apache )
EN

Stack Overflow用户
提问于 2019-11-19 15:51:22
回答 1查看 1.4K关注 0票数 3

为了测试目的,我有一个非常简单的springboot应用程序。

在这里,我的build.gradle:

代码语言:javascript
复制
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.2org.glassfish.jersey.core:jersey-client:2.28有一个传递依赖关系。然而,gradle然后使用版本2.27而不是2.28

如果运行./gradlew dependencyInsight --dependency org.glassfish.jersey.core:jersey-client,将得到以下输出:

代码语言:javascript
复制
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的依赖。

然而,在网络上搜索时,我发现了另一种跟踪依赖关系的方法:

代码语言:javascript
复制
grep -r "2.27" ~/.gradle/caches/modules-2/files-2.1/*

就像这样,我能够跟踪2.27版本是在哪里推出的。它似乎在以下几个地方宣布:

  • spring-boot-dependencies-2.1.0.RELEASE.pom
  • spring-boot-autoconfigure-2.1.0.RELEASE.pom

我现在的问题是多方面的

  • 首先,为什么spring-boot-starter-web依赖于jersey?我一直有这样的印象:如果我们想在spring实现上显式地使用spring,我们将包括spring-boot-starter-jersey
  • 为什么我看不到spring-boot-starter-web在运行./gradlew dependencies时依赖于org.glassfish.jersey.core:jersey-client:2.27。显然,当它降低版本的等级时,一定有一个依赖于它的地方。
  • 为什么2.28版降级为2.27版?如何知道哪个策略是在spring引导下应用的,以便为特定版本做出选择。
  • 这个应用程序运行得很好,但是现在我遇到了版本冲突,我应该如何最好地处理这个问题?只使用v2.28而不是v2.27是可行的选择吗?我认为这也是我关于为什么spring-boot实际上使用jersey的第一个答案。

我知道这是多个问题,但是我认为最好是用一个问题来问,而不是把它们分散到多个问题上,因为它们都与相同的背景有关。

顺便说一句:这不仅发生在org.glassfish.jersey.core:jersey-client上。同样的情况也适用于org.apache.httpcomponents:httpclient

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 18:02:01

首先,为什么spring-boot-starter-web要依赖泽西?我一直有这样的印象:如果我们想在spring实现上显式地使用spring,我们将包括spring-boot-starter-jersey

它没有。而是,它取决于Tomcat。你是正确的,你将需要球衣启动器自动配置。

为什么我看不到spring-boot-starter-web在运行./gradlew dependencies时依赖于org.glassfish.jersey.core:jersey-client:2.27。显然,当它降低版本的等级时,一定有一个依赖于它的地方。

因为没有。下面会有更多的报道。

为什么2.28版降级为2.27版?如何知道哪个策略是在spring引导下应用的,以便为特定版本做出选择。

这是根本的问题。我将在下面解释。

这个应用程序运行得很好,但是现在我遇到了版本冲突,我应该如何最好地处理这个问题?只使用v2.28而不是v2.27是可行的选择吗?我认为这也是我关于为什么spring-boot实际上使用jersey的第一个答案。

那得看情况。在我的经验中,您的依赖关系可以通过升级和降级传递依赖来打破它们,即使它只是一个小版本( SnakeYAML!)所以你真的要试一试。通常升级比降级更安全,但有时还是会引起问题。

这是泽西岛降级的交易。

Spring依赖管理插件用于控制依赖关系的版本,包括直接依赖和传递依赖。

当您同时应用依赖管理插件和Spring插件时,Spring插件将应用它的默认版本,该版本来自Spring。通过运行gradle dependencyManagement,您可以检查管理哪些依赖项以及在哪个版本中进行管理。

所有这些的想法是,您得到了一组众所周知可以很好地相互协作的依赖项。如果您喜欢一个托管依赖项的不同版本,则必须使用dependencyManagement扩展(如文档中的这里)来配置它。

这就是为什么你对泽西的依赖被降级的原因。

我个人不使用Spring依赖管理插件,因为我喜欢在普通Gradle中处理依赖关系的方式。所以我通常只做这样的事情:

代码语言:javascript
复制
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")
}

在这种情况下,它将默认使用Spring中的依赖项,但如果任何人需要更新版本,则不会降低它们的级别。但是如果需要的话,它将升级它们,如果您不愿意的话,您也不必自己指定一个版本,在这种情况下,它将使用来自BOM的版本。

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

https://stackoverflow.com/questions/58937991

复制
相关文章

相似问题

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