当前位置: 首页 > 知识库问答 >
问题:

哪个Maven BOM决定Gradle 5中依赖项的版本?

楮景明
2023-03-14

我目前正在开发一个Gradle 5项目,导入两个不同的Maven BOM。因此,我使用本地Gradle语法,而没有依赖项管理插件。但是,两个BOM可以为相同的依赖项定义不同的版本。

dependencies {
    implementation platform ("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
    implementation platform ("com.organisation:xyz:${otherBomVersion}")
}

据我所知,在Maven中,定义给定依赖项版本的第一个BOM决定了它。相反,在Gradle依赖项管理插件中,定义给定依赖项版本的最后一个BOM表决定了它。

如何在纯Gradle 5中处理进口BOM的订单?

共有2个答案

苏鹏鹍
2023-03-14

一个更简单的建议是使用Spring Boot Gradle Plugin文档中描述的这种机制,通过这种机制,您可以显式地覆盖通过设置属性选择的版本。

他们举的例子是:

ext['slf4j.version'] = '1.7.20'

您可以设置的属性的完整列表可以在Spring Boot参考文档中找到。

最后,您将有一个显式的方法来覆盖Spring Boot给出的默认值。

啊,现在我看到你实际上没有使用那个插件,所以这个机制不适用于你。好吧,如果你开始使用它,上面的工作应该是预期的和可预测的。

哈沛
2023-03-14

在Gradle中,BOM的顺序,或者在声明依赖关系的任何地方,根本不重要。与Maven不同的是,Gradle使用了最接近优先的方法,它考虑了所有依赖信息,并选择了最高的。文件说明

Gradle将考虑所有请求的版本,无论它们出现在依赖关系图中的何处。在这些版本中,它将选择最高的版本。

一个实际的例子。以下声明将始终选择2.2。5.发布Spring云依赖项BOM版本定义的Spring云网关的。SR8无论先列出哪个平台()声明:

dependencies {
    implementation platform('org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8')
    implementation platform('org.springframework.cloud:spring-cloud-dependencies:Greenwich.SR6')
    
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}

依赖项洞察报告可能如下所示:

> gradlew -q dependencyInsight --dependency spring-cloud-starter-gateway
org.springframework.cloud:spring-cloud-starter-gateway:2.2.5.RELEASE (by constraint)
   variant "compile" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library (not requested)

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.version         = 8
   ]

org.springframework.cloud:spring-cloud-starter-gateway:2.2.5.RELEASE
\--- org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8
     \--- compileClasspath

org.springframework.cloud:spring-cloud-starter-gateway -> 2.2.5.RELEASE
\--- compileClasspath

如果您更喜欢来自特定BOM的版本,您可以使用强制执行的平台()。

 类似资料:
  • 我用我的真实情况来说明问题。 我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项。我还为遗留日志API(Java . util . logging、log4j和commons-logging)使用SLF4J API桥,它们不是显式的依赖关系。这些也必须(最好)是版本1.6.4。 为了使我的pom.xml尽可能整洁和无错误,我想强制这些API桥接器与SLF4J版本相

  • 我在使用commons-codec库时遇到(NoSuchMethodError)问题,这里有我的POM:`http://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.0 我使用了exclusions和dependencyManagement,但结果是相同的 有人能告诉我更好的解决这个问题的方法吗?

  • 问题内容: 问题。 Gradle依赖管理使得: 没有简便的方法来检查依赖项更新的可用性(仅使用某些第三方插件,如ben-manes / gradle-versions-plugin)并下载更新以替换旧版本; 从远程存储库下载依赖项工件,然后将其存储在gradle缓存中,并在后续构建中重用;但是项目的成功编译必须不依赖于与Internet的连接,远程存储库的可用性以及这些存储库中特定版本的依赖项。

  • 问题。 分级依赖项管理是这样进行的: 检查依赖更新的可用性(仅使用一些第三方插件,如Ben-Manes/Gradle-Versions-Plugin),并下载替换旧版本的更新是不容易的; 依赖项构件从远程存储库下载,然后存储在gradle缓存中,并在后续构建中重用;但项目的成功编译不能依赖于与Internet的连接、远程存储库的可用性以及这些存储库中依赖项的特定版本的存在。 null

  • 对于扩展调试信息,从命令行执行Gradle,使用。/gradlew--info:app:assembleDebug查看工件的dep endency路径。此错误消息来自google-services Gradle插件,在https://github.com/google/play-services-plugins上报告问题,并通过向build.Gradle文件添加“GoogleServices{di

  • 在我们的项目中,我们使用具有依赖项的库,例如: 作为安全修复的一部分,我们假设使用更高版本的依赖项。通用编解码器:通用编解码器:1.14。在不升级expo-file-system的情况下,有没有办法告诉gradle/maven我们要用一个特定版本的commons-codec:commons-codec?