今天我尝试在我的代码中使用系统属性。当我输入./gradlew -Dorg.gradle.project.env=demo test
时,NullPointExcepetion会发生,虽然我在脚本中成功打印了env!然后我尝试另一种方式,输入{{1我的代码成功地在命令行中设置了env。所以我的问题是" -Dorg.gradle.project.env = demo"之间的差异。和" -Denv = demo"在gradle?P.s。这个链接(12.2.G https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties中的Gradle属性和系统属性)告诉我使用org.gradle.project来设置系统属性。我猜你在使用org.gradle.project时,你应该使用另一种方法来获取系统财产,不使用
./gradlew -Denv=demo test
答案 0 :(得分:2)
我想当你使用
org.gradle.project
时,你应该使用另一种方法来获取系统属性,而不是使用System.getProperty("env")
你是对的。这两种语法不同,用途不同。
后者-Denv
是Java世界中passing system properties的标准方式。如果您运行java -help
,您将会看到:
-D<名称> =<值GT;设置系统属性
因此,当您使用它时,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允许您通过提供具有特殊名称的系统属性来设置项目属性,这就是您所做的。您已通过提供名称为env
的系统属性,将名为demo
的{{3}}设置为值org.gradle.project.env
。您可以通过project.env
在构建脚本中使用此属性,并可用于以各种方式调整构建。