【问题标题】:How to run bootRun with spring profile via gradle task如何通过 gradle 任务使用 spring 配置文件运行 bootRun
【发布时间】: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")
}

几个问题:

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

-埃里克

【问题讨论】:

    标签: java spring gradle


    【解决方案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。

        【讨论】:

        【解决方案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.stackoverflow.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://stackoverflow.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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-02-11
                    • 2014-06-30
                    • 2018-05-04
                    • 1970-01-01
                    • 2023-02-01
                    • 2018-07-04
                    • 1970-01-01
                    • 2020-01-21
                    相关资源
                    最近更新 更多