Java Platform插件带来了声明Java生态系统平台的功能. 平台可用于不同目的:

平台是一种特殊的软件组件,不包含任何资源:它仅用于引用其他库,因此它们在依赖关系解析期间可以很好地协同工作.

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

java-platform插件不能与给定项目中的javajava-library插件结合使用. 从概念上一个项目或者是一个平台,没有程序, 产生二进制文件.

Usage

要使用Java Platform插件,请在构建脚本中包括以下内容:

例子1.使用Java Platform插件
build.gradle
plugins {
    id 'java-platform'
}
build.gradle.kts
plugins {
    `java-platform`
}

API and runtime separation

Maven BOM和Java平台之间的主要区别在于,在Gradle中,依赖项和约束被声明并确定范围为配置以及扩展配置的范围. 尽管许多用户只关心声明编译时依赖项的约束,这些约束是运行时和测试所继承的,但它允许声明依赖项或仅适用于运行时或测试的约束.

为了这个目的,该插件公开了两个配置可用于声明依赖性: apiruntime . api配置应用于声明在针对平台进行编译时应使用的约束和依赖关系,而runtime配置应用于声明在运行时可见的约束或依赖关系.

示例2.声明API和运行时约束
build.gradle
dependencies {
    constraints {
        api 'commons-httpclient:commons-httpclient:3.1'
        runtime 'org.postgresql:postgresql:42.2.5'
    }
}
build.gradle.kts
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将失败. 如果出于某种原因,除了约束之外,您还想添加依赖项 ,则需要显式启用它:

例子3.允许声明依赖
build.gradle
javaPlatform {
    allowDependencies()
}
build.gradle.kts
javaPlatform {
    allowDependencies()
}

Local project constraints

如果您具有多项目构建,并且要发布链接到子项目的平台,则可以通过声明属于该平台的子项目的约束来做到这一点,如下例所示:

例子4.声明子项目的约束
build.gradle
dependencies {
    constraints {
        api project(":core")
        api project(":lib")
    }
}
build.gradle.kts
dependencies {
    constraints {
        api(project(":core"))
        api(project(":lib"))
    }
}

项目符号将成为发布的元数据中的经典group:name:version符号.

Sourcing constraints from another platform

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

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

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

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

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

Publishing platforms

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

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

这将为平台生成一个BOM表文件,并带有一个<dependencyManagement>块,其中其<dependencies>对应于平台模块中定义的约束.

Consuming platforms

因为Java平台是一种特殊的组件,所以必须使用platformenforcedPlatform关键字声明对Java平台的依赖关系,如管理传递依赖关系部分中所述. 例如,如果要在子项目之间共享依赖版本,则可以定义一个平台模块来声明所有版本:

Example 7. Recommend versions in a platform module
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 {
    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")
    }
}

然后让子项目依赖平台来获取建议:

示例8.从平台获取建议
build.gradle
dependencies {
    // get recommended versions from the platform project
    api platform(project(':platform'))
    // no version required
    api 'commons-httpclient:commons-httpclient'
}
build.gradle.kts
dependencies {
    // get recommended versions from the platform project
    api(platform(project(":platform")))
    // no version required
    api("commons-httpclient:commons-httpclient")
}