我正在使用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
}
并且一些命令行魔术也失败了:
./gradle -Dspring.profiles.active=local bootRun
有人可以帮我解决烦恼吗?
从答案和评论中更新:
我可以设置systemProperty并通过执行以下操作将其传递给spring容器:
run {
systemProperty "spring.profiles.active", "local"
}
但是,当我这样做时,正在为bootRun
任务和bootRunLocal
任务设置本地配置文件。我需要一种方法为bootRunLocal
任务设置此属性,并从booRun
调用bootRunLocal
任务。
这听起来很简单,但我从Maven的结构化世界中获得了平静。
答案 0 :(得分:72)
我知道我已经很晚了......但我最近遇到了这个问题。我试图使用spring.profiles.active和spring.config.location在命令行上设置为系统属性来启动bootRun。
所以,要获得命令行" magic"要工作,只需将其添加到build.gradle
即可bootRun {
systemProperties System.properties
}
然后从命令行运行......
gradle -Dspring.profiles.active=local bootRun
将local设置为活动配置文件,而无需仅为添加env变量定义单独的任务。
答案 1 :(得分:17)
没有将系统属性传递给任务的通用方法。简而言之,它仅支持分叉单独JVM的任务。
bootRunLocal
任务(如上所定义)不会在单独的JVM中执行,并且不支持在任务上调用execute()
(并且必须在执行阶段执行)任何情况)。另一方面,测试始终在单独的JVM中执行(如果由Test
任务执行)。要为测试执行设置系统属性,您需要配置相应的Test
任务。例如:
test {
systemProperty "spring.profiles.active", "local"
}
有关详情,请参阅Gradle Build Language Reference中的Test
。
答案 2 :(得分:17)
task local {
run { systemProperty "spring.profiles.active", "local" }
}
bootRun.mustRunAfter local
然后运行gradle命令:
gradle bootRun local
答案 3 :(得分:7)
对于gradle 2.14,下面的示例有效。
我添加如下。
当System.properties [' spring.profiles.active']为null时,则设置默认配置文件。
bootRun {
systemProperty 'spring.profiles.active', System.properties['spring.profiles.active']
}
命令行示例
gradle bootRun -Dspring.profiles.active=dev
答案 4 :(得分:6)
答案 5 :(得分:5)
仅供参考,如果有人会遇到此问题:
弗拉德回答对我来说并不是很有用,但这个对于2.4很好用,
task local <<{
bootRun { systemProperty "spring.profiles.active", "local" }
}
local.finalizedBy bootRun
然后gradle local
答案 6 :(得分:3)
在此回应OP的确切要求......
如何将spring.profiles.active系统属性传递给bootRun插件的任务?
并假设通过&#34;传递&#34; OP意味着&#34;从命令行传递&#34;或者&#34;从IDE调用传递#34; ......这就是我喜欢的方式。
将此添加到build.gradle:
fs.readFile('./facebookAuthServer/oauth.txt', function read(err, data) {
if (err) {
throw err;
}
fbNode.setAuthorization({token: data, clientSecret: authSettings.clientSecret});
// Use the auth for next call
fbNode.fetchItems(displayItems);
});
然后,当您调用它时,请使用熟悉的Java标志来设置系统属性
/**
* Task from spring-boot-gradle-plugin, configured for easier development
*/
bootRun {
/* Lets you pick Spring Boot profile by system properties, e.g. gradle bootRun -Dspring.profiles.active=dev */
systemProperties = System.properties
}
通过环境变量选项(gradle bootRun -Dspring.profiles.active=local
)坚持系统属性有一个主要优点......以及Linux / OS X(bash等)和Windows之间的易移植性(无论如何,cmd.exe)。
我从this blog post学到了这种方式。
(更新:啊,不知怎的,我错过了@ Erich的回复,同样的建议。哎呀!我留下了答案,因为有关便携性的其他细节等等。)
答案 7 :(得分:3)
您可以创建一个新任务(在讨论的情况下使用名称bootRunLocal
),在任务执行之前扩展org.springframework.boot.gradle.run.BootRunTask
和设置属性。您可以使用以下代码创建此类任务:
task bootRunLocal(type: org.springframework.boot.gradle.run.BootRunTask) {
doFirst() {
main = project.mainClassName
classpath = sourceSets.main.runtimeClasspath
systemProperty "spring.profiles.active", "local"
}
}
更多细节可以在这里找到: https://karolkalinski.github.io/gradle-task-that-runs-spring-boot-aplication-with-profile-activated/
答案 8 :(得分:2)
根据spring-boot-gradle-plugin documentation,您应该能够传递这样的参数
./gradlew bootRun --args='--spring.profiles.active=dev'
自4.9以来,这似乎是gradle的新功能。我在项目中使用了它,并且开箱即用。
答案 9 :(得分:1)
这有效:
SPRING_PROFILES_ACTIVE = production ./gradlew app-service:bootRun
答案 10 :(得分:1)
从SpringBoot 2.0.0-M5开始setSystemProperties()
不再是任务bootRun的方法。
build.gradle需要更新为
bootRun {
execSpec {
// System.properties["spring.profiles.active"]
systemProperties System.properties
}
}
这是springBoot的运行任务使用org.gradle.process.JavaExecSpec
这适用于我使用Gradle 4.2
答案 11 :(得分:0)
使用run命令,您可以添加到构建文件run { systemProperties = System.properties }
并从gradle run -Dspring.profiles.active=local
开始
答案 12 :(得分:0)
另一种不需要gradle任务支持的方法:设置JAVA_TOOL_OPTIONS环境变量:
JAVA_TOOL_OPTIONS='-Dfoo=bar' gradle ...
或者,如果变量可能已包含任何有用的内容:
JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -Dfoo=bar" gradle ...
答案 13 :(得分:0)
// defualt value
def profiles = 'dev'
bootRun {
args = ["--spring.profiles.active=" + profiles]
}
然后,您可以在执行gradle任务时简单地选择特定版本,例如
./gradlew bootRun -P dev
“ dev”将发生在“ prod”