如何通过 gradle 任务使用 spring 配置文件运行 bootRun

Posted

技术标签:

【中文标题】如何通过 gradle 任务使用 spring 配置文件运行 bootRun【英文标题】:How to run bootRun with spring profile via gradle task 【发布时间】:2016-08-23 17:26:17 【问题描述】:

我正在尝试设置 gradle 以启动 bootRun 进程并启用各种弹簧配置文件。

我当前的bootRun 配置如下:

bootRun 
    // pass command line options from gradle to bootRun
    // usage: gradlew bootRun "-Dspring.profiles.active=local,protractor"
    if (System.properties.containsKey('spring.profiles.active')) 
        systemProperty "spring.profiles.active", System.properties['spring.profiles.active']
    

我想用gradle任务设置系统属性,然后执行bootRun

我的尝试看起来像这样:

task bootRunDev

bootRunDev  
    System.setProperty("spring.profiles.active", "Dev")

几个问题:

    systemProperty 是 spring boot bootRun 配置的一部分吗? 是否可以在另一个任务中设置系统属性? 我的下一步应该是什么?我需要在bootRun 之前进行bootRunDev 配置 我是否应该研究另一种方法

-埃里克

【问题讨论】:

【参考方案1】:

Spring Boot 2.5+ 的工作解决方案

tasks.register('runDev') 
   dependsOn 'bootRun'
   bootRun.systemProperty('spring.profiles.active', 'dev')

然后运行:

./gradlew runDev

【讨论】:

【参考方案2】:

我的方式:

在 gradle.properties 中:

profile=profile-dev

在 build.gradle 添加虚拟机选项 -Dspring.profiles.active:

bootRun 
   jvmArgs = ["-Dspring.output.ansi.enabled=ALWAYS","-Dspring.profiles.active="+profile]

这将覆盖应用程序 spring.profiles.active 选项

【讨论】:

【参考方案3】:

添加到 VM 选项: -Dspring.profiles.active=dev

或者您可以将其添加到 build.gradle 文件中以使其工作:bootRun.systemProperties = System.properties。

【讨论】:

这需要添加到build.gradle 文件中以使其工作:bootRun.systemProperties = System.properties。见github.com/spring-projects/spring-boot/issues/…【参考方案4】:

Kotlin 版:在build.gradle.kts 文件中定义以下任务:

tasks.named<BootRun>("bootRun") 
  args("--spring.profiles.active=dev")

这会将参数--spring.profiles.active=dev 传递给bootRun,在这种情况下,配置文件名称为dev

每次运行 gradle bootRun 时,都会使用配置文件 dev

【讨论】:

【参考方案5】:

在您的build.gradle 文件中,只需使用以下 sn-p

bootRun 
  args = ["--spring.profiles.active=$project.properties['profile'] ?: 'prod'"]

然后运行以下命令以使用dev 配置文件:

./gradlew bootRun -Pprofile=dev

【讨论】:

【参考方案6】:

对于希望在 Kotlin DSL 中执行此操作的任何人,以下是 build.gradle.kts 的工作示例:

tasks.register("bootRunDev") 
    group = "application"
    description = "Runs this project as a Spring Boot application with the dev profile"
    doFirst 
        tasks.bootRun.configure 
            systemProperty("spring.profiles.active", "dev")
        
    
    finalizedBy("bootRun")

【讨论】:

【参考方案7】:

Spring Boot v2 Gradle plugin docs 提供答案:

6.1。将参数传递给您的应用程序

与所有 JavaExec 任务一样,在使用 Gradle 4.9 或更高版本时,可以使用 --args='&lt;arguments&gt;' 从命令行将参数传递到 bootRun。

在活动配置文件设置为 dev 的情况下运行服务器:

$ ./gradlew bootRun --args='--spring.profiles.active=dev'

【讨论】:

这绝对有效,你能告诉我如何在 bootJar 任务中传递这些【参考方案8】:

环境变量可用于设置弹簧属性,如the documentation 中所述。因此,要设置活动配置文件 (spring.profiles.active),您可以在 Unix 系统上使用以下代码:

SPRING_PROFILES_ACTIVE=test gradle clean bootRun

在 Windows 上你可以使用:

SET SPRING_PROFILES_ACTIVE=test
gradle clean bootRun

【讨论】:

虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 在 *nix 上,您可能需要导出变量以使其对 gradle 可见:export SPRING_PROFILES_ACTIVE=dev; gradle bootRun 不,在每次调用的基础上设置环境变量的工作方式如 david 所示。 它确实可以在 Windows 上运行!就我而言,我什至没有运行 bootRun,而是执行 SpringBootTest 测试,这些测试需要活动配置文件才能通过 spring-cloud-config 检索属性。【参考方案9】:

我希望它能够像你一样调用 gradle bootRunDev 而不需要做任何额外的输入。

这对我有用 - 首先在我的任务中配置 bootRun,然后在它运行 bootRun 之后立即运行,这对我来说很好:)

task bootRunDev 
    bootRun.configure 
        systemProperty "spring.profiles.active", 'Dev'
    


bootRunDev.finalizedBy bootRun

【讨论】:

【参考方案10】:

使用这个shell命令就可以了:

SPRING_PROFILES_ACTIVE=test gradle clean bootRun

遗憾的是,这是我找到的最简单的方法。 它为该调用设置环境属性,然后运行应用程序。

【讨论】:

只是 x 但我应该把它放在哪里?抱歉,我对你的问题投了反对票 直接在shell中。第一部分定义一个环境变量,然后是 Gradle 命令。无需投反对票。 我也认为这是最简单的方法。感谢分享。【参考方案11】:

最简单的方法是定义默认值并允许它被覆盖。我不确定在这种情况下 systemProperty 的用途是什么。简单的参数就可以了。

def profiles = 'prod'

bootRun 
  args = ["--spring.profiles.active=" + profiles]

运行开发:

./gradlew bootRun -Pdev

要为您的任务添加依赖项,您可以执行以下操作:

task setDevProperties(dependsOn: bootRun) << 
  doFirst 
    System.setProperty('spring.profiles.active', profiles)
  

在 Gradle 中有很多方法可以实现这一点。

编辑:

为每个环境配置单独的配置文件。

if (project.hasProperty('prod')) 
  apply from: 'gradle/profile_prod.gradle'
 else 
  apply from: 'gradle/profile_dev.gradle'

每个配置都可以覆盖任务,例如:

def profiles = 'prod'
bootRun 
  systemProperty "spring.profiles.active", activeProfile

在这种情况下,通过提供prod 标志来运行,就像这样:

./gradlew <task> -Pprod

【讨论】:

当我尝试这种方法时,我得到了Could not find method dev() for arguments [org.springframework.boot:spring-boot-devtools] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.。 ***.com/a/31328621/1134197 工作正常 虽然第一个代码 sn -p 显示了如何配置 bootRun 任务,但其他示例根本不起作用。 您能否更新-Pdev 将如何将profiles 设置为dev?它似乎根本不起作用。 您显然还需要将“org.springframework.boot”插件应用到您的项目中。 对于任何对-P 感到困惑的人,请参阅 Spring 网站上的 Passing System properties to your application。它允许将属性传递给 JVM。【参考方案12】:

为 4 个不同的任务配置不同的配置文件和 gradle 任务依赖项:

bootRunLocalbootRunDev - 使用特定配置文件运行 bootPostgresRunLocalbootPostgresRunDev 与 prev 相同,但在 bootRun 之前/之后执行自定义任务 runPostgresDockerkillPostgresDocker

build.gradle:

final LOCAL='local'
final DEV='dev'

void configBootTask(Task bootTask, String profile) 
    bootTask.main = bootJar.mainClassName
    bootTask.classpath = sourceSets.main.runtimeClasspath

    bootTask.args = [ "--spring.profiles.active=$profile" ]
//    systemProperty 'spring.profiles.active', profile // this approach also may be used
    bootTask.environment = postgresLocalEnvironment


bootRun 
    description "Run Spring boot application with \"$LOCAL\" profile"
    doFirst() 
        configBootTask(it, LOCAL)
    


task bootRunLocal(type: BootRun, dependsOn: 'classes') 
    description "Alias to \":$bootRun.name\" task: $bootRun.description"
    doFirst() 
        configBootTask(it, LOCAL)
    


task bootRunDev(type: BootRun, dependsOn: 'classes') 
    description "Run Spring boot application with \"$DEV\" profile"
    doFirst() 
        configBootTask(it, DEV)
    


task bootPostgresRunLocal(type: BootRun) 
    description "Run Spring boot application with \"$LOCAL\" profile and re-creating DB Postgres container"
    dependsOn runPostgresDocker
    finalizedBy killPostgresDocker
    doFirst() 
        configBootTask(it, LOCAL)
    


task bootPostgresRunDev(type: BootRun) 
    description "Run Spring boot application with \"$DEV\" profile and re-creating DB Postgres container"
    dependsOn runPostgresDocker
    finalizedBy killPostgresDocker
    doFirst() 
        configBootTask(it, DEV)
    

【讨论】:

【参考方案13】:

对于那些使用 Spring Boot 2.0+ 的人,您可以使用以下内容来设置一个任务,该任务将使用一组给定的配置文件运行应用程序。

task bootRunDev(type: org.springframework.boot.gradle.tasks.run.BootRun, dependsOn: 'build') 
    group = 'Application'

    doFirst() 
        main = bootJar.mainClassName
        classpath = sourceSets.main.runtimeClasspath
        systemProperty 'spring.profiles.active', 'dev'
    

然后,您可以在 IDE 中简单地运行 ./gradlew bootRunDev 或类似的东西。

【讨论】:

我们如何为这个任务自定义 webapp 文件夹..?【参考方案14】:

对于来自互联网的人,有一个类似的问题https://***.com/a/35848666/906265 我也在这里提供了修改后的答案:

// build.gradle
<...>

bootRun 

// make sure bootRun is executed when this task runs
task runDev(dependsOn:bootRun) 
    // TaskExecutionGraph is populated only after 
    // all the projects in the build have been evaulated https://docs.gradle.org/current/javadoc/org/gradle/api/execution/TaskExecutionGraph.html#whenReady-groovy.lang.Closure-
    gradle.taskGraph.whenReady  graph ->
        logger.lifecycle('>>> Setting spring.profiles.active to dev')
        if (graph.hasTask(runDev)) 
            // configure task before it is executed
            bootRun 
                args = ["--spring.profiles.active=dev"]
            
        
    


<...>

然后在终端:

gradle runDev

用过gradle 3.4.1spring boot 1.5.10.RELEASE

【讨论】:

以上是关于如何通过 gradle 任务使用 spring 配置文件运行 bootRun的主要内容,如果未能解决你的问题,请参考以下文章

Gradle测试任务,如何设置Spring Boot环境进行测试?

如何使用 Spring Boot“bootJar”插件创建 gradle 任务以生成爆炸性战争?

spring多个时间点定时任务怎么配

如何通过 Gradle 测试任务在我的 JUnit 上启用调试

带有 Gradle 的 Spring Boot 任务失败:测试?

带有私有仓库的 Spring Boot Gradle bootBuildImage 任务