如何处理基于 Spring Boot 的库和不匹配的 Spring Boot 版本

问题描述 投票:0回答:1

我们正在运行多个服务,并且希望转移到库中获取一些通用代码,因为复制和粘贴不再有效。

我确实有一些自定义 Spring Boot 启动器的经验,但想知道如何处理我过去遇到的一个常见问题:库和包含它们的服务之间的 Spring Boot 版本存在差异。

这是一个简短的例子:

my-library is based on SB 3.0.1
my-service is based on SB 3.0.3

通常可以使用

my-service
隐式强制
SB 3.0.3
,但我想避免这种情况,因为我们在执行此操作时遇到了一些令人讨厌的问题(例如
my-library
的测试对于
SB 3.0.1
是绿色的,但会失败
SB 3.0.3
,这将不会被检测到并导致部署被巧妙地破坏,因为例如,不再导出经过专门测试以存在于
my-library
中的特定指标 - 这最近会发生在我们的
SB 3.0.9
中) .

如何配置我的 gradle 项目以在这种情况下不允许使用两个不同的 Spring Boot 版本? 我想知道是否有一个分类器,例如

my-library:1.0.1:sb3.0.1
适用于此,但我不知道是否例如翻新将支持所需的依赖声明:
my-library:${my-lib-version}:sb${sb.version}

我正在寻找一种优雅的方式,无需为每个 Spring Boot 版本更新手动调整我的

build.gradle.kts
,因为我们维护了太多单独的服务,因此这是可行的。如果可能的话,我想避免任何类型的自定义项目父设置(就像 Spring Boot 的 Maven 集成的情况一样)。

spring-boot gradle dependency-management spring-boot-starter
1个回答
0
投票

https://docs.gradle.org/current/userguide/dependency_resolution.html

默认:

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

如果您的库定义了更高版本,并且使用项目没有定义任何附加约束,那么您的库版本将获胜。

但是,如果您的消费项目管理自己的依赖项(这对于使用 依赖管理插件平台版本目录 时的 Spring Boot 项目来说是典型的情况),那么消费者定义的版本可能会在依赖项解析过程中获胜。

最终,您必须修改每个项目的构建以遵守您的库版本。这可以通过发布平台 (BOM) 或版本目录来完成,然后您的消费者将使用它来代替 Spring Boot BOM。

因此,例如:

dependencies {
    implementation(platform(SpringBootPlugin.BOM_COORDINATES))
}

你会这样做:

dependencies {
    implementation(enforcedPlatform("com.example:my-library-platform:1.0.0"))
}

但是正如您提到的,您有几个项目。 OpenRewrite 等工具可以通过自动化该过程来提供帮助。或者在 CI/CD 解决方案中,您可以创建/定义全局初始化脚本来自定义构建。

© www.soinside.com 2019 - 2024. All rights reserved.