Java平台插件提供了声明Java生态系统平台的能力。平台可用于不同的目的

平台是一种特殊的软件组件,它不包含任何源代码:它仅用于引用其他库,以便它们在依赖解析过程中能够良好协同工作。

平台可以发布为Gradle模块元数据Maven BOM

java-platform 插件不能在给定项目中与 javajava-library 插件结合使用。从概念上讲,一个项目要么是一个没有二进制文件的平台,要么产生二进制文件。

用法

要使用Java平台插件,请在构建脚本中包含以下内容

build.gradle.kts
plugins {
    `java-platform`
}
build.gradle
plugins {
    id 'java-platform'
}

API和运行时分离

Maven BOM与Java平台之间的一个主要区别在于,在Gradle中,依赖项和约束是声明并限定在其配置以及继承该配置的配置中的。虽然许多用户可能只关心声明编译时依赖项的约束(因此被运行时和测试依赖项继承),但Gradle允许声明仅适用于运行时或测试的依赖项或约束。

为此,该插件公开了两个可用于声明依赖项的配置apiruntimeapi 配置应用于声明在针对平台进行编译时应使用的约束和依赖项,而 runtime 配置应用于声明在运行时可见的约束或依赖项。

build.gradle.kts
dependencies {
    constraints {
        api("commons-httpclient:commons-httpclient:3.1")
        runtime("org.postgresql:postgresql:42.2.5")
    }
}
build.gradle
dependencies {
    constraints {
        api 'commons-httpclient:commons-httpclient:3.1'
        runtime 'org.postgresql:postgresql:42.2.5'
    }
}

请注意,本示例使用约束而非依赖项。一般来说,这正是您想要做的:约束仅在依赖图中添加了该组件时(无论是直接添加还是传递性添加)才会生效。这意味着平台中列出的所有约束都不会添加依赖项,除非有其他组件引入它:它们可以被视为建议

例如,如果一个平台声明了对 org:foo:1.1 的约束,并且没有其他任何东西引入对 foo 的依赖项,则 foo不会出现在图中。但是,如果 foo 出现了,那么通常的冲突解决机制就会启动。如果一个依赖项引入了 org:foo:1.0,那么我们将选择 org:foo:1.1 来满足平台约束。

默认情况下,为了避免在平台中添加依赖项而不是约束这一常见错误,如果您尝试这样做,Gradle将会失败。如果出于某种原因,您除了约束之外还需要添加依赖项,则需要显式启用它

build.gradle.kts
javaPlatform {
    allowDependencies()
}
build.gradle
javaPlatform {
    allowDependencies()
}

本地项目约束

如果您有多项目构建,并且想要发布一个链接到子项目的平台,您可以通过对属于该平台的子项目声明约束来实现,如下例所示

build.gradle.kts
dependencies {
    constraints {
        api(project(":core"))
        api(project(":lib"))
    }
}
build.gradle
dependencies {
    constraints {
        api project(":core")
        api project(":lib")
    }
}

在发布的元数据中,项目表示法将成为经典的 group:name:version 表示法。

从其他平台获取约束

有时您定义的平台是另一个现有平台的扩展。

为了让您的平台包含来自该第三方平台的约束,需要将其作为 platform 依赖项导入

示例 5. 导入平台
build.gradle.kts
javaPlatform {
    allowDependencies()
}

dependencies {
    api(platform("com.fasterxml.jackson:jackson-bom:2.9.8"))
}
build.gradle
javaPlatform {
    allowDependencies()
}

dependencies {
    api platform('com.fasterxml.jackson:jackson-bom:2.9.8')
}

发布平台

发布Java平台是通过应用 maven-publish 插件并配置使用 javaPlatform 组件的Maven发布来实现的

示例 6. 发布为BOM
build.gradle.kts
publishing {
    publications {
        create<MavenPublication>("myPlatform") {
            from(components["javaPlatform"])
        }
    }
}
build.gradle
publishing {
    publications {
        myPlatform(MavenPublication) {
            from components.javaPlatform
        }
    }
}

这将为该平台生成一个BOM文件,其中包含一个 <dependencyManagement> 块,其内部的 <dependencies> 对应于平台模块中定义的约束。

使用平台

由于Java平台是一种特殊的组件,因此对Java平台的依赖必须使用 platformenforcedPlatform 关键字声明,如管理传递性依赖一节所述。例如,如果您想在子项目之间共享依赖版本,可以定义一个平台模块来声明所有版本

build.gradle.kts
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")
    }
}
build.gradle
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'
    }
}

然后让子项目依赖于该平台以获取推荐

build.gradle.kts
dependencies {
    // get recommended versions from the platform project
    api(platform(project(":platform")))
    // no version required
    api("commons-httpclient:commons-httpclient")
}
build.gradle
dependencies {
    // get recommended versions from the platform project
    api platform(project(':platform'))
    // no version required
    api 'commons-httpclient:commons-httpclient'
}