如何通过 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='<arguments>'
从命令行将参数传递到 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 任务依赖项:
bootRunLocal
和 bootRunDev
- 使用特定配置文件运行
bootPostgresRunLocal
和 bootPostgresRunDev
与 prev 相同,但在 bootRun 之前/之后执行自定义任务 runPostgresDocker
和 killPostgresDocker
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.1
和spring boot 1.5.10.RELEASE
【讨论】:
以上是关于如何通过 gradle 任务使用 spring 配置文件运行 bootRun的主要内容,如果未能解决你的问题,请参考以下文章
Gradle测试任务,如何设置Spring Boot环境进行测试?
如何使用 Spring Boot“bootJar”插件创建 gradle 任务以生成爆炸性战争?
如何通过 Gradle 测试任务在我的 JUnit 上启用调试