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

时间:2014-04-29 14:26:12

标签: 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
}

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

./gradle -Dspring.profiles.active=local bootRun

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

从答案和评论中更新:

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

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

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

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

14 个答案:

答案 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)

SPRING_PROFILES_ACTIVE=local gradle clean bootRun

根据thisthis,这是有效的。

答案 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”