tutorial traduccion español compile spring gradle spring-boot

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"


SPRING_PROFILES_ACTIVE=local gradle clean bootRun

Esto es de acuerdo con this y this y funciona.


task local { run { systemProperty "spring.profiles.active", "local" } } bootRun.mustRunAfter local

A continuación, ejecute el comando gradle como:

gradle bootRun local