【问题标题】:What's the defference between "-Dorg.gradle.project.env=demo" and "-Denv=demo" in gradle?gradle中的“-Dorg.gradle.project.env=demo”和“-Denv=demo”有什么区别?
【发布时间】:2017-11-16 01:40:21
【问题描述】:

今天我试图在我的代码中使用系统属性。当我输入 ./gradlew -Dorg.gradle.project.env=demo test 时,会发生 NullPointExcepetion,尽管我在脚本中成功地 println env!然后我尝试另一种方式,输入 ./gradlew -Denv=demo test 并且我的代码得到在命令行中设置的环境成功。所以我的问题是gradle中的“-Dorg.gradle.project.env=demo”和“-Denv=demo”有什么区别?这个链接(12.2. Gradle properties and system properties in https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties)告诉我使用 org.gradle.project 来设置系统属性。我猜你在使用 org.gradle.project 时应该使用另一种方法来获取系统属性,不使用 System.getProperty("env")

【问题讨论】:

    标签: java gradle build.gradle


    【解决方案1】:

    我猜当你使用org.gradle.project时,你应该使用另一种方法来获取系统属性,而不是使用System.getProperty("env")

    你是对的。这两种语法不同,用途也不同。

    后者-Denv是Java世界passing system properties的标准方式。如果你运行java -help,你会看到:

    -D=设置系统属性

    因此,当您使用它时,env 系统属性将通过System.getProperty("env") 变得可用,其值为demo

    第一个-Dorg.gradle.project.env其实也是系统属性!看完上面的几行就很明显了。但是,它设置了一个名为org.gradle.project.env 的系统属性,而不仅仅是env。所以,除非你的测试期望这个名字,否则它不会起作用。而且您的测试不能指望这个名称,因为它们通常应该不知道构建工具。

    Gradle docs 说的是:

    Gradle 提供了多种向构建添加属性的方法。使用 -D 命令行选项,您可以将系统属性传递给运行 Gradle 的 JVM。 gradle 命令的 -D 选项与 java 命令的 -D 选项作用相同。

    Gradle 还可以在看到特别命名的系统属性或环境变量时设置项目属性。当您没有持续集成服务器的管理员权限并且您需要设置不易看到的属性值(通常是出于安全原因)时,此功能非常有用。在这种情况下,您不能使用 -P 选项,也不能更改系统级配置文件。正确的策略是更改持续集成构建作业的配置,添加与预期模式匹配的环境变量设置。这对系统上的普通用户是不可见的。

    如果环境变量名称看起来像 ORG_GRADLE_PROJECT_prop=somevalue,那么 Gradle 将在您的项目对象上设置一个 prop 属性,其值为 somevalue。 Gradle 也支持此系统属性,但命名模式不同,类似于 org.gradle.project.prop

    换句话说,Gradle 允许您通过提供具有特殊名称的系统属性来设置项目属性,这就是您所做的。通过提供名称为 org.gradle.project.env 的系统属性,您已将名为 envProject's property 设置为值 demo。此属性可通过project.env 在您的构建脚本中使用,并可用于以各种方式调整构建。

    【讨论】:

    • 谢谢你的回答,你帮了我很多!
    • 你是 Gradle 之神。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多