我真的很喜欢Gradle的java平台特性。我已经创建了自己的平台,该平台将spring引导依赖项与其他东西捆绑在一起。现在我有(为了清晰起见缩短):
plugins {
id 'org.springframework.boot' version '2.4.1'
}
dependencies {
implementation platform("my-group:my-base-bom:1.0.0")
}
并且我希望spring引导插件版本自动调整以匹配我的平台中捆绑的spring引导依赖的版本(因此,如果平台转到SB 2.5.0,那么插件也会这样做,而无需更改build.gradle。
我不知道如何做到这一点,虽然不诉诸外部变量。这可能吗?
不可能。目前,有(3)种方法来定义插件的版本:
直接在Gradle文件中:
// build.gradle.kts
plugins {
id("org.springframework.boot") version "2.4.1"
}
在插件依赖规范中:
// settings.gradle.kts
pluginManagement {
plugins {
id("org.springframework.boot") version "2.4.1"
}
}
或带有分辨率规则的
// settings.gradle.kts
pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == "org.springframework.boot") {
useVersion("2.4.1")
}
}
}
}
所有这些都不接受一个平台,只有一个版本变量。
我测试了另一种方法,但最终没有成功,那就是使用buildscript
:
// build.gradle.kts
buildscript {
dependencies {
classpath(platform("io.mateo.sample:platform-bom:1.0.0-SNAPSHOT"))
classpath("org.springframework.boot:spring-boot-gradle-plugin")
}
}
如开头所述,这是不可能的。
您的自定义平台可以提供关于您希望客户端使用哪个版本的Spring Boot Gradle插件的意见(特别是因为它不包含在spring-boot-dependencies
BOM中)。
build.gradle.kts
文件的相关部分,例如:
plugins {
`java-platform`
}
javaPlatform {
allowDependencies()
}
dependencies {
// This platform extends the Spring Boot platform.
api(platform("org.springframework.boot:spring-boot-dependencies:2.7.6"))
constraints {
// Provide an opinion about which version of the Spring Boot Gradle plugin clients
// should use since it's not included in the standard spring-boot-dependencies BOM.
api("org.springframework.boot:spring-boot-gradle-plugin:2.7.6")
}
}
这将生成一个对齐spring-boot-gradle-plugin
和spring-boot-dependencies
的BOM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-gradle-plugin</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
您的客户端项目可以依赖于您的平台,并继承其对Spring Boot版本的意见,使用如下命令:
buildSrc/build.gradle.kts
:
// Pull in the version of the Spring Boot Gradle plugin specified by your
// platform, making it available to your regular build script.
dependencies {
implementation(enforcedPlatform("my-group:my-base-bom:1.0.0"))
implementation("org.springframework.boot:spring-boot-gradle-plugin")
}
build.gradle.kts
:
plugins {
id("org.springframework.boot") // version inherited from your platform
}
dependencies {
// It's necessary to specify it for each configuration.
implementation(enforcedPlatform("my-group:my-base-bom:1.0.0"))
// Pull in any normal Spring Boot-managed dependencies you need (versions come from platform).
implementation("org.springframework.boot:spring-boot-starter-web")
}
当然,你也可以使用Gradle版本目录来集中版本,为了清晰起见,这些目录在示例中是内联的。