java - initializr - spring gradle
Cómo ejecutar bootRun con perfil de resorte a través de la tarea gradle (7)
Agregue a las opciones de VM: -Dspring.profiles.active = dev
Estoy intentando configurar Gradle para iniciar el proceso bootRun
con varios perfiles de Spring habilitados.
Mi configuración actual de bootRun
parece a:
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'']
}
}
Me gustaría establecer las propiedades del sistema con una tarea de gradle
y luego ejecutar bootRun
.
Mi intento se veía así:
task bootRunDev
bootRunDev {
System.setProperty("spring.profiles.active", "Dev")
}
Unas cuantas preguntas:
- ¿Es
systemProperty
una parte de la configuración bootRun de boot de spring? - ¿Es posible establecer una propiedad del sistema en otra tarea?
- ¿Cuál debería ser mi próximo paso? Necesito que la configuración
bootRunDev
ocurra antes quebootRun
- ¿Hay otro enfoque que debería considerar?
-Eric
Configuración para 4 tareas diferentes con diferentes perfiles y dependencias de tareas gradle:
-
bootRunLocal
ybootRunDev
: se ejecutan con un perfil específico -
bootPostgresRunLocal
ybootPostgresRunDev
igual que anterior, pero ejecutando la tarea personalizadarunPostgresDocker
ykillPostgresDocker
antes / después de bootRun
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)
}
}
La forma más sencilla sería definir el valor predeterminado y permitir que se anule. No estoy seguro de cuál es el uso de systemProperty en este caso. Argumentos simples harán el trabajo.
def profiles = ''prod''
bootRun {
args = ["--spring.profiles.active=" + profiles]
}
Para ejecutar dev:
./gradlew bootRun -Pdev
Para agregar dependencias en su tarea puede hacer algo como esto:
task setDevProperties(dependsOn: bootRun) << {
doFirst {
System.setProperty(''spring.profiles.active'', profiles)
}
}
Hay muchas maneras de lograr esto en Gradle.
Editar:
Configurar archivos de configuración separados por entorno.
if (project.hasProperty(''prod'')) {
apply from: ''gradle/profile_prod.gradle''
} else {
apply from: ''gradle/profile_dev.gradle''
}
Cada configuración puede anular tareas, por ejemplo:
def profiles = ''prod''
bootRun {
systemProperty "spring.profiles.active", activeProfile
}
Ejecutar proporcionando la prod
en este caso así como así:
./gradlew <task> -Pprod
Las variables de entorno se pueden utilizar para establecer las propiedades del resorte como se describe en la documentación . Entonces, para establecer el perfil activo ( spring.profiles.active
) puede usar el siguiente código en los sistemas Unix:
SPRING_PROFILES_ACTIVE=test gradle clean bootRun
Y en windows puedes usar:
SET SPRING_PROFILES_ACTIVE=test
gradle clean bootRun
Para alguien de Internet, hubo una pregunta similar https://.com/a/35848666/906265 También proporciono la respuesta modificada aquí:
// 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"]
}
}
}
}
<...>
luego en la terminal:
gradle runDev
Se han utilizado el gradle 3.4.1
y la spring boot 1.5.10.RELEASE
Para aquellas personas que usan Spring Boot 2.0+, puede usar lo siguiente para configurar una tarea que ejecutará la aplicación con un conjunto dado de perfiles.
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''
}
}
Luego, simplemente puede ejecutar ./gradlew bootRunDev
o similar desde su IDE.
Sólo:
SPRING_PROFILES_ACTIVE = prueba gradle clean bootRun
Lamentablemente esta es la forma más simple que he encontrado. Establece la propiedad del entorno para esa llamada y luego ejecuta la aplicación.