Java 平台插件提供了为 Java 生态系统声明平台的能力。一个平台可以用于不同的目的:
-
一起发布的模块的描述(例如,共享相同的版本)
-
一组异构库的推荐版本。一个典型的例子包括Spring Boot BOM
-
在子项目之间共享一组依赖版本
平台是一种特殊的软件组件,不包含任何源:它仅用于引用其他库,以便它们在依赖关系解析期间可以很好地协同工作。
平台可以发布为Gradle 模块元数据和Maven BOM。
该插件不能与给定项目中的或插件java-platform 结合使用。从概念上讲,项目要么是一个没有二进制文件的平台,要么生成二进制文件。
java java-library |
用法
要使用 Java 平台插件,请在构建脚本中包含以下内容:
plugins {
`java-platform`
}
plugins {
id 'java-platform'
}
API 和运行时分离
Maven BOM 和 Java 平台之间的主要区别在于,在 Gradle 中声明依赖项和约束,并将其范围限定为配置和扩展它的配置。虽然许多用户只关心声明编译时依赖项的约束,从而由运行时和测试依赖项继承,但它允许声明仅适用于运行时或测试的依赖项或约束。
为此,该插件公开了两个可用于声明依赖项的配置api
:和runtime
。配置api
应该用于声明针对平台进行编译时应该使用的约束和依赖项,而配置runtime
应该用于声明在运行时可见的约束或依赖项。
dependencies {
constraints {
api("commons-httpclient:commons-httpclient:3.1")
runtime("org.postgresql:postgresql:42.2.5")
}
}
dependencies {
constraints {
api 'commons-httpclient:commons-httpclient:3.1'
runtime 'org.postgresql:postgresql:42.2.5'
}
}
请注意,此示例使用约束而不是依赖关系。一般来说,这就是您想要做的:仅当此类组件直接或传递地添加到依赖关系图中时,约束才会适用。这意味着平台中列出的所有约束都不会添加依赖项,除非另一个组件将其引入:它们可以被视为建议。
例如,如果一个平台声明了对 的约束 |
默认情况下,为了避免在平台中添加依赖项而不是约束的常见错误,如果您尝试这样做,Gradle 将失败。如果由于某种原因,除了约束之外,您还想添加依赖项,则需要显式启用它:
javaPlatform {
allowDependencies()
}
javaPlatform {
allowDependencies()
}
当地项目限制
如果您有一个多项目构建并想要发布一个链接到子项目的平台,您可以通过声明属于该平台的子项目的约束来实现,如下例所示:
dependencies {
constraints {
api(project(":core"))
api(project(":lib"))
}
}
dependencies {
constraints {
api project(":core")
api project(":lib")
}
}
项目符号将成为group:name:version
已发布元数据中的经典符号。
来自另一个平台的采购限制
有时,您定义的平台是另一个现有平台的扩展。
为了让您的平台包含来自第三方平台的约束,需要将其作为platform
依赖项导入:
javaPlatform {
allowDependencies()
}
dependencies {
api(platform("com.fasterxml.jackson:jackson-bom:2.9.8"))
}
javaPlatform {
allowDependencies()
}
dependencies {
api platform('com.fasterxml.jackson:jackson-bom:2.9.8')
}
发布平台
发布 Java 平台是通过应用maven-publish
插件并配置使用该组件的 Maven 发布来完成的javaPlatform
:
publishing {
publications {
create<MavenPublication>("myPlatform") {
from(components["javaPlatform"])
}
}
}
publishing {
publications {
myPlatform(MavenPublication) {
from components.javaPlatform
}
}
}
这将为平台生成一个 BOM 文件,其中包含一个与平台模块中定义的约束相对应的<dependencyManagement>
块。<dependencies>
消费平台
由于 Java 平台是一种特殊类型的组件,因此必须使用platform
orenforcedPlatform
关键字声明对 Java 平台的依赖关系,如管理传递依赖关系部分中所述。例如,如果您想在子项目之间共享依赖版本,您可以定义一个平台模块来声明所有版本:
dependencies {
constraints {
// Platform declares some versions of libraries used in subprojects
api("commons-httpclient:commons-httpclient:3.1")
api("org.apache.commons:commons-lang3:3.8.1")
}
}
dependencies {
constraints {
// Platform declares some versions of libraries used in subprojects
api 'commons-httpclient:commons-httpclient:3.1'
api 'org.apache.commons:commons-lang3:3.8.1'
}
}
然后让子项目依赖于平台来获取推荐:
dependencies {
// get recommended versions from the platform project
api(platform(project(":platform")))
// no version required
api("commons-httpclient:commons-httpclient")
}
dependencies {
// get recommended versions from the platform project
api platform(project(':platform'))
// no version required
api 'commons-httpclient:commons-httpclient'
}