从 Gradle 将系统属性传递到 Spring Boot

Posted

技术标签:

【中文标题】从 Gradle 将系统属性传递到 Spring Boot【英文标题】:Passing system properties into Spring Boot from Gradle 【发布时间】:2017-02-10 17:51:41 【问题描述】:

我想将某些安全敏感属性传递到我的 Spring Boot 应用程序中,我在开发期间通过 Gradle、命令行和/或外部设置的系统属性启动该应用程序。我不能将它们写入 build.gradle 脚本或属性文件之类的东西,因为它们将被提交到源代码管理中,然后将公开可用。

我找不到任何解决方案,无法让 Gradle 使用 Gradle 2.4.4 执行的应用程序使用这些值。

几个解决方案看起来像这样,其中系统属性在 bootRun 任务中设置:

bootRun 
    systemProperties System.properties

这似乎完全覆盖了默认的 bootRun 任务并破坏了 Spring Boot 的自动主类检测。

其他地方有人建议这样做:

bootRun 
    run systemProperties System.properties

这不会覆盖正常的配置,但是在 run 闭包中设置的属性在 bootRun 任务中不可用。

这一切都是在我使用 Intellij 启动 Gradle 时发生的。

如果我从命令行启动 Gradle 并尝试以属性方式传递,例如:

gradle -Dspring.email.password=123 bootRun

无论配置如何,都不会在任何地方设置该属性。更改参数的顺序没有效果。

【问题讨论】:

【参考方案1】:

将 JVM 参数作为 gradle 属性传递,并使用以下配置将它们转发给应用程序:

bootRun 
    if (project.hasProperty('jvmArgs')) 
        jvmArgs project.jvmArgs.split('\\s+')
    

应用 jvmArgs 运行:./gradlew bootrun -PjvmArgs="-Dspring.profiles.active=myprofile -Dspring.email.password=secret"

【讨论】:

这是一种聪明的做法。想知道 Maven 中是否有类似于“mvn -Dspring.profiles.active=...”的内容。听起来像在 Gradle 中,没有简单的方法来传递任务范围属性? 使用 gradle,您始终可以将属性作为 cli-argument 传递(例如-P prop=foo)并在您的任务中访问它们(project.properties[“prop”])。您始终可以使用 groovy(或 kotlin)编写自己的逻辑。

以上是关于从 Gradle 将系统属性传递到 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

通过 Gradle 运行 Java 类时传递系统属性和参数的问题

将系统属性与 proguard 配置文件一起传递给 gradle proguardFile 属性

如何将本地 Maven m2 作为属性传递给 Gradle?

如何将参数从 gradle exec 任务传递到命令行

如何将模型属性从一个 Spring MVC 控制器传递到另一个控制器?

Spring Webflow:如何在转换期间将属性从一个流传递到另一个流?