您可能从未听说过的服务缺少用户名,密码或令牌? 这通常发生在您尝试执行任何操作(例如仅构建项目)时,不仅发生在使用给定的插件(例如在线代码覆盖工具)时。 我不想修改我的环境,而只是为另一个开源项目提供一个小的修复。 这很烦我,我想更改它。 从Gradle 2.13开始,这成为可能。 但是,让我们从原因开始(如果您仅对解决方案感兴趣,请前进至最后两段)。

为什么会显示“找不到财产……”?

大多数Gradle插件都需要配置。 可以直接在build.gradle设置一些属性,但是其他一些属性(尤其是凭据)最好保留在~/.gradle/gradle.properties 。 因此,插件配置部分通常如下所示:

bintray {
    user = project.getProperty('bintrayUser')
    key = project.getProperty('bintrayKey')
    ...
}

或者那个:

bintray {
    user = getProperty('bintrayUser')
    key = getProperty('bintrayKey')
    ...
}

甚至更短:

bintray {
    user = bintrayUser
    key = bintrayKey
    ...
}

对于在其本地配置中定义了bintrayUserbintrayKey的项目开发人员而言,它工作正常,但是对于每个未每日上传到Bintray的人,它都会失败:

* What went wrong:
A problem occurred evaluating root project 'another-nice-open-source-project'.
> Could not find property 'bintrayKey' on com.jfrog.bintray.gradle.BintrayExtension_Decorated@2ecc563.

结果是project.getProperty() (未提及显式分配)只是在未找到特定属性时引发异常。 不好的是,代码是在配置短语中执行的。 因此,即使与该特定插件无关的每项任务(例如gw tasksgw wrapper )的执行都会失败。

作为解决方法,必须执行防护检查:

bintray {    //Gradle <2.13
    user = hasProperty('bintrayUser') ? getProperty('bintrayUser') : ''
    key = hasProperty('bintrayKey') ? getProperty('bintrayKey') : ''
    ...
}

看起来不太紧凑。 作为另一个选择,可以将虚拟占位符保留在项目配置中,但是从Gradle 2.13开始,有一种更好的方法来应对。

project.findProperty()

Gradle 2.13是我新方法project.findProperty() 贡献的第一个版本。 它的行为与getProperty()相同,但是不抛出异常,而是返回null值。 这大大简化了分配:

bintray {    //Gradle 2.13+
    user = findProperty('bintrayUser') ?: ''
    key = findProperty('bintrayKey') ?: ''
    ...
}

有人可能会说Optional作为返回值可能会更好,但这是一个API,并且Gradle支持早于8的Java。

摘要

对我来说, findProperty是我在Gradle中经常寻找的一种方法。 很遗憾,我花了一年多的时间才提出这项要求。 Gradle 2.13刚刚发布,跨项目的版本升级将逐步进行。 这可能需要一些时间,但是每个迁移到2.13的项目都将能够简化其配置,使“无法在插件Y上找到属性X”错误消息成为过去的回忆(当然,除非您确实需要将特定的插件配置为用它)。