如何通过gradle任务使用spring profile运行bootRun

Eri*_*cis 37 java spring gradle

我正在尝试设置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']
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我的尝试看起来像这样:

task bootRunDev

bootRunDev  {
    System.setProperty("spring.profiles.active", "Dev")
}
Run Code Online (Sandbox Code Playgroud)

几个问题:

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

-Eric

Vae*_*lyr 37

最简单的方法是定义默认值并允许它被覆盖.我不确定在这种情况下systemProperty的用途是什么.简单的论据可以完成这项工作.

def profiles = 'prod'

bootRun {
  args = ["--spring.profiles.active=" + profiles]
}
Run Code Online (Sandbox Code Playgroud)

要运行dev:

./gradlew bootRun -Pdev
Run Code Online (Sandbox Code Playgroud)

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

task setDevProperties(dependsOn: bootRun) << {
  doFirst {
    System.setProperty('spring.profiles.active', profiles)
  }
}
Run Code Online (Sandbox Code Playgroud)

在Gradle中有很多方法可以实现这一目标.

编辑:

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

if (project.hasProperty('prod')) {
  apply from: 'gradle/profile_prod.gradle'
} else {
  apply from: 'gradle/profile_dev.gradle'
}
Run Code Online (Sandbox Code Playgroud)

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

def profiles = 'prod'
bootRun {
  systemProperty "spring.profiles.active", activeProfile
}
Run Code Online (Sandbox Code Playgroud)

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

./gradlew <task> -Pprod
Run Code Online (Sandbox Code Playgroud)

  • 虽然第一个代码片段显示了如何配置`bootRun`任务,但其他示例根本不起作用. (3认同)
  • 你能更新`-Pdev`如何将`profiles`设置为`dev`吗?似乎它根本不起作用。 (3认同)

小智 36

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

SPRING_PROFILES_ACTIVE=test gradle clean bootRun
Run Code Online (Sandbox Code Playgroud)

在Windows上你可以使用:

SET SPRING_PROFILES_ACTIVE=test
gradle clean bootRun
Run Code Online (Sandbox Code Playgroud)

  • 不,在每次调用的基础上,设置环境变量的工作方式如 david 所示。 (3认同)
  • 虽然此代码段可以解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量.请记住,您将来会回答读者的问题,而这些人可能不知道您的代码建议的原因. (2认同)

Raf*_*ael 12

使用这个 shell 命令它将工作:

SPRING_PROFILES_ACTIVE=test gradle clean bootRun
Run Code Online (Sandbox Code Playgroud)

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


Pat*_*non 11

对于 Gradle 7.5 和 Spring Boot 2.7.3 的命令行,我这样做(如果它对任何人有帮助的话):

gradle bootRun --args=--spring.profiles.active=myprofile
Run Code Online (Sandbox Code Playgroud)


dea*_*mon 10

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

tasks.named<org.springframework.boot.gradle.tasks.run.BootRun>("bootRun") {
  args("--spring.profiles.active=dev")
}
Run Code Online (Sandbox Code Playgroud)

这会将参数传递给--spring.profiles.active=dev,在本例中bootRun为配置文件名称dev

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


Yon*_*ree 8

对于那些使用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'
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需./gradlew bootRunDev从IDE 运行或类似.


Jak*_*las 8

对于任何想在 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")
}
Run Code Online (Sandbox Code Playgroud)


小智 8

在您的build.gradle文件中只需使用以下代码片段

bootRun {
  args = ["--spring.profiles.active=${project.properties['profile'] ?: 'prod'}"]
}
Run Code Online (Sandbox Code Playgroud)

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

./gradlew bootRun -Pprofile=dev
Run Code Online (Sandbox Code Playgroud)


小智 7

我希望它很简单,只是为了能够像您一样调用 gradle bootRunDev 而无需进行任何额外的输入。

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

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

bootRunDev.finalizedBy bootRun
Run Code Online (Sandbox Code Playgroud)


Aiv*_*ras 6

Spring Boot v2 Gradle插件文档提供了一个答案:

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

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

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

$ ./gradlew bootRun --args='--spring.profiles.active=dev'
Run Code Online (Sandbox Code Playgroud)

  • 这绝对有效,你能告诉我如何在 bootJar 任务中传递这些吗 (3认同)