Maven 属性的 Gradle 等效项

rav*_*ave 3 gradle maven

如何在 Gradle 中添加类似于 Maven 属性的属性?

用例是这样的:我想要一个文件,它声明 repo 依赖项的所有版本,以便它们在多模块项目的一个地方统一

compile group: 'javax.servlet.jsp.jstl', name: 'jstl', version: '1.2'

在 Maven 中,您可以拥有这样的属性:

<properties>
    <jstlVersion>1.2</jstlVersion>
</properties>
Run Code Online (Sandbox Code Playgroud)

可以使用 Gradle 的外部属性吗?或者只是将它们添加到 gradle.properties 文件中?

Pet*_*ook 5

根构建文件中定义的项目属性可用于子项目。所以如果你在你的根build.gradle文件中有这个:

ext.commonsLangVersion = "2.4"
Run Code Online (Sandbox Code Playgroud)

然后您可以在dependencies {}子项目的块中使用它,如下所示:

dependencies {
    implementation "commons-lang:commons-lang:${commonsLangVersion}"
}
Run Code Online (Sandbox Code Playgroud)

您还可以在根gradle.properties文件而不是根构建文件中定义此类属性。你以同样的方式使用它们。

如果您真的觉得需要将版本放在一个单独的文件中,您可以这样做。只需将以下行添加到根构建文件中:

apply from: "dependencies.gradle"
Run Code Online (Sandbox Code Playgroud)

dependencies.gradle文件中,您可以定义额外的项目属性,就像它们直接在根构建文件中一样:

ext.commonsLangVersion = "2.4"
Run Code Online (Sandbox Code Playgroud)

注意通常,构建脚本中设置的值优先于gradle.properties 中的值。但是如果你在根构建脚本中设置一个值,那么gradle.properties 中的任何匹配值在 subprojects 中覆盖它。

这种行为有点令人困惑和独特。对于与 Gradle 单项目构建一致的行为,您需要在根构建脚本中使用以下内容:

allprojects {
    apply from: "dependencies.gradle"
}
Run Code Online (Sandbox Code Playgroud)

作为一般的经验法则,任何给定的财产应当申报/定义或者构建脚本 gradle.properties。如果用户想要覆盖特定的属性值,他们可以在$USER_HOME/.gradle/gradle.properties 中进行

[编辑我已经更新了上述说明以澄清实际行为]

最后一件事:Gradle 还允许您通过依赖项约束来控制传递依赖项的版本。如果您使用的是 Gradle 4.6 或更高版本,您还可以导入 Maven BOM