Gradle.properties未传递到我的Java应用程序

时间:2019-06-12 13:44:42

标签: java gradle

问题

我有一个项目级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

2 个答案:

答案 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