问题
我有一个项目级gradle.properties
文件,该文件定义了各种systemProp.*
值(尤其是代理内容)。我是从the documentation得到这个想法的。
我希望这些属性可以传递给运行我的应用程序的JVM,以便我的应用程序可以在运行时使用这些值。
但是,似乎没有任何systemProp
值通过。
我误解了它应该如何工作?
可重复的示例
我创建了一个小的GitHub存储库,该存储库显示了运行情况:https://github.com/gmacster/gradle-system-properties-passthrough
我在systemProp
中定义了一个名为gradle.properties
的自定义some-sample-prop
。我的main()
方法读取此属性的值并记录下来。
我只是在运行gradlew run
,没有多余的参数。
版本信息
------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------
Build time: 2019-04-26 08:14:42 UTC
Revision: 261d171646b36a6a28d5a19a69676cd098a4c19d
Kotlin: 1.3.21
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM: 11.0.2 (Oracle Corporation 11.0.2+9-LTS)
OS: Windows 10 10.0 amd64
答案 0 :(得分:2)
gradle.properties
中定义的系统属性仅传递给运行Gradle本身的JVM,而不传递给您用来运行应用程序的插件所派生的JVM。因此,为了将系统属性从Gradle传递到Gradle启动的应用程序,您需要手动将它们复制到systemProperties
任务的JavaExec
属性中。假设您正在使用application plugin提供的run
任务,并且systemProp.proxy.host=example.proxy.host.com
文件中有一个gradle.properties
,则需要执行此操作(另请参见{{ 3}}在Gradle论坛中):
task.named('run') {
systemProperties = [
'proxy.host': System.getProperty('proxy.host')
]
}
但是让我问你为什么需要这种间接方式。我假设您只需要那些属性即可运行应用程序。如果是这种情况,直接在构建脚本中定义它们会更容易:
task.named('run') {
systemProperties = [
'proxy.host': 'example.proxy.host.com'
]
}
答案 1 :(得分:-1)
即使不是一个好主意,您也可以访问,因为该文件应该存储仅用于gradle任务的属性。
我建议您在 src / main / resources 下有一个application.properties并从那里读取文件。
但是,如果要存储在gradle.properties中,可以通过以下方法进行检索:
public static void main(String[] args) throws IOException {
FileInputStream input = new FileInputStream("gradle.properties");
// load a properties file
Properties prop = new Properties();
prop.load(input);
System.out.println(prop.getProperty("systemProp.some-sample-prop"));
}
它将打印:
hello world