spring - traduccion - Cómo pasar la propiedad del sistema a la tarea gradle
gradle vs maven (13)
Estoy usando el complemento gradle spring-boot
y necesito seleccionar un perfil activo de primavera para la ejecución de prueba.
¿Cómo spring.profiles.active
propiedad del sistema spring.profiles.active
a la bootRun
complemento bootRun
?
Lo que ya falló
task bootRunLocal {
systemProperty "spring.profiles.active", "local"
System.setProperty("spring.profiles.active", "local")
tasks.bootRun.execute() // I suspect that this task is executed in a separate JVM
}
y alguna magia de línea de comando también falla:
./gradle -Dspring.profiles.active=local bootRun
¿Podría alguien amablemente ayudarme a resolver mis problemas?
Actualización de las respuestas y comentarios:
Puedo configurar systemProperty y pasarlo al contenedor de resorte haciendo:
run {
systemProperty "spring.profiles.active", "local"
}
Sin embargo, cuando hago esto, el perfil local se establece para la tarea bootRunLocal
y la tarea bootRunLocal
. Necesito una forma de establecer esta propiedad para la tarea bootRunLocal
y llamar a la tarea bootRunLocal
desde bootRunLocal
.
Eso puede sonar muy simple, pero vengo con paz desde el mundo estructurado de Maven.
A partir de SpringBoot 2.0.0-M5 setSystemProperties()
ya no es un método de la tarea bootRun. El build.gradle necesita ser actualizado a
bootRun {
execSpec {
// System.properties["spring.profiles.active"]
systemProperties System.properties
}
}
Esto es como la tarea de ejecución de org.gradle.process.JavaExecSpec
usa org.gradle.process.JavaExecSpec
Esto funciona para mí usando Gradle 4.2
Esto funciona:
SPRING_PROFILES_ACTIVE = production ./gradlew app-service: bootRun
No hay una forma genérica de pasar propiedades del sistema a una tarea. En pocas palabras, solo es compatible con tareas que bifurcan una JVM separada.
La tarea bootRunLocal
(como se define arriba) no se ejecutará en una JVM separada, y la execute()
en una tarea no es compatible (y tendría que suceder en la fase de ejecución en cualquier caso). Las pruebas, por otro lado, siempre se ejecutan en una JVM separada (si la ejecuta una tarea de Test
). Para establecer las propiedades del sistema para la ejecución de la prueba, debe configurar las tareas de Test
correspondientes. Por ejemplo:
test {
systemProperty "spring.profiles.active", "local"
}
Para obtener más información, vea Test
en Gradle Build Language Reference .
Otra forma que no requiere ningún soporte de la tarea gradle: establecer la variable de entorno JAVA_TOOL_OPTIONS :
JAVA_TOOL_OPTIONS=''-Dfoo=bar'' gradle ...
O si la variable ya puede contener algo útil:
JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -Dfoo=bar" gradle ...
Para gradle 2.14 a continuación el ejemplo funciona. He agregado lo siguiente.
Cuando System.properties [''spring.profiles.active''] es nulo, se establece el perfil predeterminado.
bootRun {
systemProperty ''spring.profiles.active'', System.properties[''spring.profiles.active'']
}
ejemplo de línea de comando
gradle bootRun -Dspring.profiles.active=dev
Puede crear una nueva tarea (en el caso discutido con el nombre bootRunLocal
), que extendería org.springframework.boot.gradle.run.BootRunTask
y las propiedades de configuración antes de la ejecución de la tarea. Puede crear dicha tarea con el siguiente código:
task bootRunLocal(type: org.springframework.boot.gradle.run.BootRunTask) {
doFirst() {
main = project.mainClassName
classpath = sourceSets.main.runtimeClasspath
systemProperty "spring.profiles.active", "local"
}
}
Puede encontrar más detalles aquí: https://karolkalinski.github.io/gradle-task-that-runs-spring-boot-aplication-with-profile-activated/
Respondiendo a la solicitud exacta de OP aquí ...
¿Cómo transfiero la propiedad del sistema spring.profiles.active a la tarea del complemento bootRun?
Y asumiendo por "pase" el OP significaba "pasar de la línea de comando" o "pasar de la invocación IDE" ... Así es como me gusta hacerlo.
Agregue esto a build.gradle:
/**
* Task from spring-boot-gradle-plugin, configured for easier development
*/
bootRun {
/* Lets you pick Spring Boot profile by system properties, e.g. gradle bootRun -Dspring.profiles.active=dev */
systemProperties = System.properties
}
Luego, cuando lo invoque, use la bandera familiar de Java para configurar una propiedad del sistema
gradle bootRun -Dspring.profiles.active=local
Hay una ventaja principal de apegarse a las propiedades del sistema, sobre la opción de variables de entorno ( SPRING_PROFILES_ACTIVE=local gradle bootRun
) ... y eso es fácil de transportar entre Linux / OS X (bash, etc.) y Windows (cmd.exe de todos modos).
Aprendí de esta manera en esta publicación de blog .
(ACTUALIZACIÓN: Ah, de alguna manera, había omitido la respuesta de @ Erich con la misma recomendación. Vaya, dejo mi respuesta, debido a los detalles adicionales sobre la portabilidad, etc.)
Sé que llegué tarde ... pero recientemente me enfrenté a este problema exacto. Estaba intentando iniciar bootRun con spring.profiles.active y spring.config.location establecidos como propiedades del sistema en la línea de comandos.
Por lo tanto, para que su línea de comandos funcione como "mágica", simplemente agréguela a su build.gradle
bootRun {
systemProperties System.properties
}
Luego corriendo desde la línea de comando ...
gradle -Dspring.profiles.active=local bootRun
Establecerá local como el perfil activo, sin necesidad de definir una tarea separada simplemente para agregar la variable env.
Solo como referencia si alguien tiene este problema:
La respuesta de Vlad no funcionó para mí, pero esta funciona muy bien con 2.4,
task local <<{
bootRun { systemProperty "spring.profiles.active", "local" }
}
local.finalizedBy bootRun
luego gradle local
con el comando de ejecución puede agregar al archivo de compilación run { systemProperties = System.properties }
y comenzar con gradle run -Dspring.profiles.active=local
// defualt value
def profiles = ''dev''
bootRun {
args = ["--spring.profiles.active=" + profiles]
}
Luego, simplemente puede elegir una versión específica al comenzar una tarea de gradle, como
./gradlew bootRun -P dev
"dev" va a tener lugar "prod"
task local {
run { systemProperty "spring.profiles.active", "local" }
}
bootRun.mustRunAfter local
A continuación, ejecute el comando gradle como:
gradle bootRun local