2014-04-29 64 views
31

我正在使用gradle spring-boot插件,我需要为测试运行选择一个spring活动配置文件。如何将系统属性传递给gradle任务

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

什么已经失败:

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" 
} 

然而,当我做到这一点,本地配置文件正在为​​任务和bootRunLocal任务设置。我需要一种方法来为bootRunLocal任务设置此属性,并从bootRunLocal调用booRun任务。

这听起来很简单,但我从Maven的结构化世界中获得了平静。

+0

根据彼得(如下图),你不应该调用execute()上的任务。我认为我们需要解决这个问题才能解决真正的问题。 –

+0

我完全同意彼得,但我们有其他选择吗?像取决于喜欢,doFirst,doLast? – WeMakeSoftware

+0

@Funtik请参阅下面发布的简单解决方案。我已经用bootRun在许多项目上使用了它。 – Erich

回答

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

bootRun.mustRunAfter local 

然后运行gradle这个命令:

gradle bootRun local 
+0

你的答案看起来非常接近,但对我来说并不合适。下面Peter的回答似乎使财产“承担”,并且适用于bootRun任务。我不明白这是为什么,但我认为这与下面Peter描述的跑位不起作用有关。 您是否考虑编辑您的答案以删除运行{}部分?当我做出改变它确实有效。 –

15

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

bootRunLocal任务(定义如上)不会在单独的JVM中执行,并且不支持在任务上调用​​(并且在任何情况下都必须在执行阶段发生)。另一方面,测试总是在单独的JVM中执行(如果由Test任务执行)。要为测试执行设置系统属性,您需要配置相应的Test任务。例如:

test { 
    systemProperty "spring.profiles.active", "local" 
} 

欲了解更多信息,请参阅Gradle Build Language ReferenceTest

+0

感谢您的及时回复。有没有一种方法可以明确地将任务分派到独立的JVM中运行? – WeMakeSoftware

+0

流程与此类似:gradle - > spring-boot插件 - > bootRun任务 - >启动spring容器。有没有办法将SystemProperty传递给spring容器? – WeMakeSoftware

+0

没有通用的方法来分派任务。它取决于任务(类型)是否以及如何支持它。系统属性相同。 –

1

这工作:

SPRING_PROFILES_ACTIVE =生产./gradlew应用服务:bootRun

+1

此问题已被回答,您的答案不包含此原因的原因。 – Alexander

+2

这个工作的原因是,尽管Gradle不会将系统属性传递给Spring Boot,但它会传递环境变量。 Spring Boot能够在解析属性时获取环境变量,而手工更改属性文件的最后十个月使我看起来像是一个完全和绝对的白痴 https://fbflex.wordpress.com/2014/10/ 16/spring-boot-shannanigan-overriding-properties-via-the-command-line-when-gradle/ – david

5

仅供参考,如果任何人都会遇到这个问题:

弗拉德回答并没有完全为我工作,但与2.4这个伟大工程,

task local <<{ 
    bootRun { systemProperty "spring.profiles.active", "local" } 
} 
local.finalizedBy bootRun 

然后gradle local

55

我知道我迟到了这里...但我最近面临这个确切的问题。我试图启动bootRun,将spring.profiles.active和spring.config.location设置为命令行中的系统属性。

所以,让你的命令行“神奇”的工作,只需添加到您的build.gradle

bootRun { 
    systemProperties System.properties 
} 

然后在命令行中运行...

gradle -Dspring.profiles.active=local bootRun 

将设置本地作为活动配置文件,而无需单独定义一个单独的任务来添加env变量。

+0

最真棒!谢谢:) – Redfox

+1

@BigDong你的build.gradle中是否还有'应用插件:'spring-boot''? – Erich

2

响应这里OP精确的请求......

我如何通过spring.profiles.active系统属性的bootRun插件的任务是什么?

并假设通过“OP”意味着“通过命令行”或“从IDE调用传递”......这就是我喜欢这样做的方式。

添加这的build.gradle:

/** 
* 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 
} 

然后,当你调用它,使用熟悉的Java标志设置一个系统属性

gradle bootRun -Dspring.profiles.active=local 

有坚持系统的一个主要优点属性,通过环境变量选项(SPRING_PROFILES_ACTIVE=local gradle bootRun)...这就是Linux/OS X(bash等)和Windows(无论如何,cmd.exe)之间的轻松移植性。

我从this blog post了解到这种方式。

(更新:!啊不知何故,我已经错过了@埃里希与同样推荐响应哎呀我要离开,因为关于便携性的更多详细信息,等我的答案,)

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/

5
SPRING_PROFILES_ACTIVE=local gradle clean bootRun 

这是根据thisthis和它的作品。

+0

我不得不将参数传递给码头集装箱。这是我需要的唯一工作答案。 '码头运行-e SPRING_PROFILES_ACTIVE =测试[...] gradle gradle测试' – Lynch

0

与运行命令,您可以添加到构建文件run { systemProperties = System.properties }与gradle这个run -Dspring.profiles.active=local

6

开始的gradle为2.14以下示例工作。 我已经添加如下。
当System.properties ['spring.profiles.active']为空时,将设置默认配置文件。

bootRun { 
     systemProperty 'spring.profiles.active', System.properties['spring.profiles.active'] 
    } 

命令行示例

gradle bootRun -Dspring.profiles.active=dev 
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

这工作我用摇篮4.2

+0

非常感谢! –

0

,它不需要任何支持的另一种方式为gradle任务:设置JAVA_TOOL_OPTIONS环境变量:

JAVA_TOOL_OPTIONS='-Dfoo=bar' gradle ... 

或者如果变量migh牛逼已经包含任何有用的东西:

JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -Dfoo=bar" gradle ... 
相关问题