Archivo application.properties específico del entorno en la aplicación Spring Boot [cerrado]

85

En mi aplicación Spring Boot, quiero crear un archivo de propiedades específicas del entorno. El tipo de empaquetado de mi aplicación en guerra y lo estoy ejecutando en tomcat integrado. Utilizo pts y ejecuto la principal desde la misma pts.

  1. ¿Puedo tener un archivo de propiedades específicas del entorno como la aplicación - $ {env-value} .properties?

En el caso anterior, env-value tendrá valores como local / devl / test / prod

  1. ¿Dónde establecer el archivo de valor de env? Para local, puedo configurarlo como el argumento jvm a través de sts

  2. Quién lee application.properties en la aplicación Spring Boot.

  3. ¿Cómo cargar el archivo de propiedades específicas del entorno? Por ejemplo, si configuro el uid, pwd, esquema, etc. de la base de datos en el archivo de propiedades específico del entorno, en ese caso, ¿la fuente de datos podrá comprender las propiedades que contiene?

  4. ¿Puedo usar el archivo application.properties y application-local.properties al mismo tiempo?

usuario3534483
fuente
¿Has leído esto ? Básicamente, se admite de forma inmediata.
M. Deinum
Lo hice pero eso no funciona. Así que tengo el archivo application.properties y el archivo application-local.properties en la misma ubicación. El archivo application-local.properties contiene propiedades relacionadas con la base de datos. application.properties tiene una propiedad única con respecto a spring mvc. También agregué -Dprofile = local como configuración de depuración, pero este valor no se recoge
user3534483
porque necesita configurarlo, spring.active.profilesuse -Dspring.active.profiles=local. en lugar.
M. Deinum
Sin éxito señor. así que en lugar de -Dprofile, ahora estoy usando -Dspring.active.profiles = local. Y luego en mi archivo de configuración trato de buscar el valor String driverClassName = env.getProperty ("driverClassName"); env es el entorno de la primavera
user3534483
1
Lo siento, lo mezclé :).
M. Deinum

Respuestas:

170

Spring Boot ya tiene soporte para propiedades basadas en perfiles .

Simplemente agregue un application-[profile].propertiesarchivo y especifique los perfiles a usar usando la spring.profiles.activepropiedad.

-Dspring.profiles.active=local

Esto cargará el application.propertiesy el application-local.propertiescon las últimas propiedades que prevalecen sobre el primero.

M. Deinum
fuente
1
¿Podemos anular el uso de las propiedades de la aplicación con otro archivo para un perfil específico sin cargar ambos? ¿Para pruebas o desarrollo, por ejemplo?
Hassam Abdelillah
1
M. Deinum, yo también tengo un problema similar, tengo application.yml y application-qa.yml y le di -Dspring.profiles.active = qa, ambos archivos se están leyendo pero las propiedades de application-qa.yml no sobrescriben el propiedades de application.yml, ¿siempre veo propiedades de application.yml solamente? ¿Hay alguna forma de especificar la prioridad?
Suresh Chaganti
5
Hola a ambos, esto puede resolver sus problemas. docs.spring.io/spring-boot/docs/current/reference/html/… Ejemplo: mkyong.com/spring-boot/…
Anand Varkey Philips
Estoy escribiendo código para aws lambda y puedo pasar esta clave = valor como valor de entorno, al que se puede acceder usando System.getenv (), ¿funcionará?
Abdeali Chandanwala
Tengo 4 aplicaciones- {perfil} archivo .properties. Y quiero ejecutar el mismo archivo jar en un entorno diferente, digamos dev, test, prod. Entonces no puedo usar -Dspring.profiles.active = local. Por favor corríjame si me falta algo.
Ashish Burnwal
24

Sí tu puedes. Dado que está utilizando Spring, consulte la @PropertySourceanotación.

Anote su configuración con

@PropertySource("application-${spring.profiles.active}.properties")

Puede llamarlo como quiera y agregar varios archivos de propiedad si también lo desea. Puede ser bueno si tiene más conjuntos y / o valores predeterminados que pertenecen a todos los entornos (también se puede escribir con @PropertySource {..., ..., ...}).

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

Entonces puede iniciar la aplicación con el entorno

-Dspring.active.profiles=test

En este ejemplo, el nombre se reemplazará con application-test-properties y así sucesivamente.

Tzen
fuente
2
El problema es que $spring.profiles.active}es una cadena separada por matriz / coma. Por lo tanto, es posible que no haga lo que usted espera / desea que haga cuando hay varios perfiles activos.
M. Deinum
Eso es cierto, pero funciona bien para dos perfiles: uno predeterminado y otro definido con PropertySource. Para un manejo de propiedades más avanzado, creo que tendrá que buscar fuera de Spring. Además, PropertySource solo se lee durante el inicio. Otras bibliotecas más avanzadas para el manejo de propiedades también pueden cambiar el tiempo de ejecución de las propiedades.
Tzen
2
Esto funcionó, pero todavía no entiendo por qué tuve que hacer esto manualmente. En uno de mis otros repositorios no tuve que hacer esto.
The Java Guy
7

podemos hacer así:

en application.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

en application-test.yml :

server:
  port: 5000

y en application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

luego, Spring Boot iniciará nuestra aplicación como deseamos.

Calamar
fuente
2
¿No está codificando el perfil activo de esta manera? :(
Anna Medyukh
0

Mi punto, de esta manera no se pide al desarrollador que cree todo el entorno relacionado de una sola vez, lo que genera el riesgo de exponer la configuración de producción al desarrollador final.

según 12-Factor, no debe ser específico del medio ambiente, residir solo en el medio ambiente.

¿Cómo lo hacemos para CI CD?

  • Construya Spring una vez y promueva a otro entorno, en ese caso, si tenemos Spring Jar tiene todo el entorno, será un riesgo de seguridad, teniendo todas las variables de entorno en GIT
Karthik_Rajendiran
fuente