从 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?