Establecer el perfil activo y la ubicación de configuración desde la línea de comandos en el arranque de primavera

164

Tengo una aplicación de arranque de primavera.

Tengo tres perfiles en mi aplicación-> desarrollo, puesta en escena y producción . Entonces tengo 3 archivos

  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml

Mi application.yml reside dentro src/main/resources. He configurado el perfil activo en application.yml como:

spring:
  profiles.active: development

Los otros 3 archivos de configuración específicos del perfil están presentes en la C:\configcarpeta.

Estoy usando el complemento gradle para eclipse. Cuando intento hacer un " bootRun ", estoy configurando los argumentos de la línea de comando en mi configuración de gradle en eclipse como

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

Sin embargo, la propiedad de línea de comando no se refleja y mi perfil activo siempre se configura como desarrollo (que es el que he mencionado en el archivo aplicaciones.yml). Además, la carpeta C: \ Config no busca archivos de configuración específicos del perfil.

Creo que me estoy perdiendo algo aquí. He estado tratando de resolverlo durante los últimos 2 días. Pero sin suerte. Realmente apreciaria cualquier ayuda.

O-OF-N
fuente
¿Puedes agregar tu bootRunlínea de comando también?
Biju Kunjummen
Lo estaba ejecutando desde eclipse y no desde la línea de comandos hasta ahora. Pero intenté ejecutar usando "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" y obtuve el mismo resultado.
O-OF-N

Respuestas:

341

Hay dos formas diferentes de agregar / anular propiedades de resorte en la línea de comando.

Opción 1: Propiedades del sistema Java (argumentos de VM)

Es importante que los parámetros -D estén antes de su application.jar, de lo contrario no se reconocerán.

java -jar -Dspring.profiles.active=prod application.jar

Opción 2: argumentos del programa

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config
RenRen
fuente
45
El orden de los parámetros -D es realmente importante :)
Martin
3
¿Cómo puede lograr esto mientras se despliega para decir Tomcat Container? En ese caso, simplemente pongo mi guerra en la carpeta webapps de tomcat, ¿cómo proporciono la información del perfil? estableciendo propiedades del sistema?
prayagupd
@prayagupd sí, puede tener propiedades del sistema establecidas en su bash_profile.
mis mejores deseos
2
@maneesh sí, estoy usando la variable env SPRING_PROFILES_ACTIVE exportada a través de ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
prayagupd
1
Cuando dice que el orden es importante: ¿Podemos pasar ambos argumentos: -Dspring.profile.active y -Dspring.config.location de tal manera que el perfil se establece de acuerdo con el primer argumento y el archivo de propiedades se recoge de acuerdo con el segundos args? Por ejemplo:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur
26

Mi mejor práctica es definir esto como un argumento VM "-D". Tenga en cuenta las diferencias entre spring boot 1.xy 2.x.

Los perfiles para habilitar se pueden especificar en la línea de comando:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

ejemplo de uso con maven:

Spring-Boot 2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x

mvn spring-boot:run -Dspring.profiles.active=local

Asegúrese de separarlos con una coma para varios perfiles:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Sma Ma
fuente
¿Te refieres a primavera / bota de primavera? (Spring 1x y Spring 2x)!
smilyface
1
@smilyface arranque de primavera. Spring Boot también está disponible en diferentes versiones: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
Yo uso spring-boot 2.1.3, y -Dspring-boot.run.profiles=localno funcionó, -Dspring.profiles.active=localfuncionó.
Donghua Liu
spring-boot 2.2.0: funciona tanto: -Dspring-boot.run.profilesy-Dspring.profiles.active
Grigory Kislin
17

Tuve que agregar esto:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

Y ahora bootRun recoge el perfil y las ubicaciones de configuración.

Muchas gracias @jst por el puntero.

O-OF-N
fuente
77
Esto puede ser aún más simple de la siguiente manera: bootRun { systemProperties = System.properties }. Este comando copiará todos los parámetros pasados ​​con el -Dinterruptor con las mismas teclas para systemPropertyasignar.
edufinn
esta parece ser una solución única, ¿no hay una solución genérica?
user1767316
1
¿Dónde exactamente estás agregando esto? ¿En algún lugar del archivo build.gradle o en una ubicación específica dentro del archivo?
Entusiasta de Scala
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

no es correcto.

debiera ser:

--spring.profiles.active=staging --spring.config.location=C:\Config
Michael Yin
fuente
3
Esto causa el error "Opción no reconocida: --spring.config.location"
James Watkins
-D es la forma correcta de establecer las propiedades del sistema Java. --algo es un parámetro bash.
Xdg
--spring.profiles.active trabajo para mí, lo mismo que me referí de docs.spring.io/spring-boot/docs/current/reference/html/…
Pushkar
Esto también funciona para mí cuando uso Ejecutar como -> Aplicación Java en Eclipse
Olivier Boissé
11
en realidad AMBOS son correctos, depende de cómo se use: puede ser java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarORjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi
9

puede usar la siguiente línea de comando:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Rollen Holt
fuente
9

Hay otra forma de configurar la variable del sistema operativo , SPRING_PROFILES_ACTIVE .

por ejemplo:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Referencia: Cómo configurar perfiles Spring activos

Rothin Sen
fuente
Sí, y esto evita la necesidad de perder el tiempo con la forma en que Gradle transfiere las propiedades del sistema a la aplicación.
ben3000
Esta es la manera ordenada. También se debe usar para establecer usuarios de bases de datos y contraseñas y otras configuraciones confidenciales para que no se verifiquen en el control de versiones.
Igor Donin
7

Al configurar el perfil a través del complemento Maven , debe hacerlo a través derun.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

Con la opción de depuración:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

He visto este viaje a mucha gente ... espero que ayude

JARC
fuente
1
ha cambiado a mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, ver: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l ¡Gracias! eso funciona para mí, acabo de actualizar un proyecto de Spring Boot 1 a 2. Ahora solo los agrego a todos en mi bashrc ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith
5

Creo que su problema probablemente esté relacionado con su ubicación spring.config.location no termina la ruta con "/".

Cita los documentos

Si spring.config.location contiene directorios (a diferencia de los archivos), deben terminar en / (y se agregarán con los nombres generados desde spring.config.name antes de cargarse).

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

jst
fuente
Gracias por señalarlo. Sin embargo, cuando ejecuto -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ también me da el mismo problema. Incluso el perfil activo no se refleja. Creo que por alguna razón mi línea de comando no se pasa por alto.
O-OF-N
1
Debe seguir los consejos dados en esta pregunta para pasar los argumentos a bootRun stackoverflow.com/questions/25079244/…
jst
Gracias. Eso realmente ayudó.
O-OF-N
4

¡La respuesta de Michael Yin es correcta pero parece que se requiere una mejor explicación!

Muchos de ustedes mencionaron que esa -Des la forma correcta de especificar los parámetros de JVM y tienen toda la razón. Pero Michael también tiene razón como se menciona en la documentación de Spring Boot Profiles .

Lo que no está claro en la documentación es qué tipo de parámetro es: no --spring.profiles.activees un parámetro JVM estándar, por lo tanto, si desea usarlo en su IDE, complete los campos correctos (es decir, argumentos del programa)

Eric Taix
fuente
0

Si usa Gradle:

-Pspring.profiles.active=local
FredFlinstone
fuente