如何将系统属性传递给Gradle任务

WeM*_*are 46 spring gradle spring-boot

我正在使用Gradle spring-boot插件,我需要为测试运行选择一个弹簧活动配置文件.

如何将spring.profiles.active系统属性传递给bootRun插件的任务?

什么已经失败:

task bootRunLocal {
    systemProperty "spring.profiles.active", "local"
    System.setProperty("spring.profiles.active", "local")
    tasks.bootRun.execute() // I suspect that this task is executed in a separate JVM
}
Run Code Online (Sandbox Code Playgroud)

并且一些命令行魔法也失败了:

./gradle -Dspring.profiles.active=local bootRun
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我解决我的烦恼吗?

从答案和评论中更新:

我可以设置systemProperty并通过执行以下操作将其传递给spring容器:

run {
    systemProperty "spring.profiles.active", "local"
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,正在为bootRun任务和bootRunLocal任务设置本地配置文件.我需要一种方法来为bootRunLocal任务和调用booRun任务设置此属性bootRunLocal.

这可能听起来很简单,但我来自Maven结构化世界的和平.

Eri*_*ich 76

我知道我迟到了......但我最近遇到了这个问题.我试图使用spring.profiles.active和spring.config.location在命令行上设置为系统属性来启动bootRun.

因此,要使命令行"神奇"起作用,只需将其添加到build.gradle即可

bootRun {
    systemProperties System.properties
}
Run Code Online (Sandbox Code Playgroud)

然后从命令行运行...

gradle -Dspring.profiles.active=local bootRun
Run Code Online (Sandbox Code Playgroud)

将local设置为活动配置文件,而无需仅添加env变量来定义单独的任务.


Pet*_*ser 17

没有将系统属性传递给任务的通用方法.简而言之,它仅支持分叉单独JVM的任务.

bootRunLocal任务(如上所定义)将不会在一个单独的JVM执行,并调用execute()不支持任务(以及将具有在执行阶段发生在任何情况下).另一方面,测试始终在单独的JVM中执行(如果由Test任务执行).要为测试执行设置系统属性,您需要配置相应的Test任务.例如:

test {
    systemProperty "spring.profiles.active", "local"
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参阅Test摇篮构建语言参考.

  • Spring Boot捎带"运行"任务.所以`run {systemProperty"spring.profiles.active","local"}`应该可行. (2认同)

小智 17

task local {
    run { systemProperty "spring.profiles.active", "local" }
}

bootRun.mustRunAfter local
Run Code Online (Sandbox Code Playgroud)

然后运行gradle命令:

gradle bootRun local
Run Code Online (Sandbox Code Playgroud)


Dom*_*omo 9

根据spring-boot-gradle-plugin 文档,您应该能够传递这样的参数

./gradlew bootRun --args='--spring.profiles.active=dev'
Run Code Online (Sandbox Code Playgroud)

似乎这是自 4.9 以来的新 gradle 功能。我在我的项目中使用了它,它开箱即用。


Sou*_*mya 7

SPRING_PROFILES_ACTIVE=local gradle clean bootRun
Run Code Online (Sandbox Code Playgroud)

这是根据这个这个,它的工作原理.


小智 7

对于gradle 2.14,下面的示例有效.我添加如下.
当System.properties ['spring.profiles.active']为null时,则设置默认配置文件.

  bootRun {
       systemProperty 'spring.profiles.active', System.properties['spring.profiles.active']
    }
Run Code Online (Sandbox Code Playgroud)

命令行示例

gradle bootRun -Dspring.profiles.active=dev
Run Code Online (Sandbox Code Playgroud)


nor*_*lia 5

仅供参考,如果有人会遇到此问题:

弗拉德的回答对我来说并不是很有用,但这个对于2.4来说效果很好,

task local <<{
    bootRun { systemProperty "spring.profiles.active", "local" }
}
local.finalizedBy bootRun
Run Code Online (Sandbox Code Playgroud)

然后 gradle local