Gradle で実行時に指定したシステムプロパティをアプリケーションに引き渡す

blog1.mammb.com


以下のように指定したシステムプロパティは、Java アプリケーション側で受け取ることができない。

./gradlew run -Dapp.env=xxx -Dapp.prop=yyy

以下のように明示的に設定する必要がある。

アプリケーションプラグインの場合

plugins {
    application
}

application {
    mainClass.set("com.example.Main")
    
    gradle.startParameter.systemPropertiesArgs.forEach { (k, v) ->
        applicationDefaultJvmArgs = applicationDefaultJvmArgs + "-D$k=$v"
    }
}


Exec タスクの場合

tasks.register<Exec>("run") {
    val args = mutableListOf(
      // ...
    )
    gradle.startParameter.systemPropertiesArgs.forEach { (k, v) ->  
        args.add("-D$k=$v")  
    }
    commandLine(args)
}

なお、systemPropertiesArgs には以下の値がシステムプロパティとして暗黙裡に設定されているため、必要に応じてフィルタリングすると良い。

user.variant=
file.encoding=UTF-8
user.country=JP
user.language=ja

System.getProperties() を使うこともできるが、この場合は Gradle が定義する大量のプロパティが含まれるため、明示的なフィルタリングが必要

System.getProperties().forEach { (k, v) ->
    if (k.toString().startsWith("app.")) {
        applicationDefaultJvmArgs = applicationDefaultJvmArgs + "-D$k=$v"
    }
}