Spring boot 1.X y Spring Boot 2.X no proporcionan las mismas opciones y comportamiento sobre el Externalized Configuration
.
La muy buena respuesta de M. Deinum se refiere a las especificaciones de Spring Boot 1.
Actualizaré para Spring Boot 2 aquí.
Fuentes de propiedades ambientales y orden
Spring Boot 2 usa un PropertySource
orden muy particular que está diseñado para permitir una anulación sensata de los valores. Las propiedades se consideran en el siguiente orden:
Propiedades de configuración global de Devtools en su directorio de inicio (~ / .spring-boot-devtools.properties cuando devtools está activo).
@TestPropertySource
anotaciones en tus pruebas.
@SpringBootTest#properties
atributo de anotación en sus pruebas. Argumentos de línea de comando.
Propiedades de SPRING_APPLICATION_JSON
(JSON en línea incrustado en una variable de entorno o propiedad del sistema).
ServletConfig
parámetros de inicio
ServletContext
parámetros de inicio
Atributos JNDI de java:comp/env
.
Propiedades del sistema Java ( System.getProperties()
).
Variables de entorno del sistema operativo.
A RandomValuePropertySource
que tiene propiedades solo al azar. *.
Propiedades de aplicación específicas de perfil fuera de su jar empaquetado ( application-{profile}.properties
y variantes de YAML).
Propiedades de aplicación específicas de perfil incluidas dentro de su jar ( application-{profile}.properties
y variantes de YAML).
Propiedades de la aplicación fuera de su jar empaquetado ( application.properties
y variantes YAML).
Propiedades de la aplicación empaquetadas dentro de su jar ( application.properties
y variantes de YAML).
@PropertySource
anotaciones en tus @Configuration
clases. Propiedades predeterminadas (especificadas por la configuración
SpringApplication.setDefaultProperties
).
Para especificar archivos de propiedades externas, estas opciones deberían interesarle:
Propiedades de aplicación específicas de perfil fuera de su jar empaquetado ( application-{profile}.properties
y variantes de YAML).
Propiedades de la aplicación fuera de su jar empaquetado ( application.properties
y variantes YAML).
@PropertySource
anotaciones en tus @Configuration
clases. Propiedades predeterminadas (especificadas por la configuración
SpringApplication.setDefaultProperties
).
Puede usar solo una de estas 3 opciones o combinarlas según sus requisitos.
Por ejemplo, para casos muy simples, usar solo propiedades específicas de perfil es suficiente, pero en otros casos es posible que desee usar propiedades específicas de perfil, propiedades predeterminadas y @PropertySource
.
Ubicaciones predeterminadas para los archivos application.properties
Acerca de los application.properties
archivos (y variantes), Spring los carga de forma predeterminada y agrega sus propiedades en el entorno a partir de estos en el siguiente orden:
Las prioridades más altas son tan literalmente:
classpath:/,classpath:/config/,file:./,file:./config/
.
¿Cómo usar archivos de propiedades con nombres específicos?
Las ubicaciones predeterminadas no siempre son suficientes: las ubicaciones predeterminadas como el nombre de archivo predeterminado ( application.properties
) pueden no ser adecuadas. Además, como en la pregunta de OP, es posible que deba especificar varios archivos de configuración distintos de application.properties
(y variante).
Entoncesspring.config.name
no será suficiente.
En este caso, debe proporcionar una ubicación explícita utilizando la spring.config.location
propiedad del entorno (que es una lista separada por comas de ubicaciones de directorio o rutas de archivos).
Para ser libre sobre el patrón de nombres de archivo, favorezca la lista de rutas de archivos sobre la lista de directorios.
Por ejemplo hacer así:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Esa manera es la más detallada que solo especificando la carpeta, pero también es la forma de especificar muy finamente nuestros archivos de configuración y documentar claramente las propiedades efectivamente utilizadas.
spring.config.location ahora reemplaza las ubicaciones predeterminadas en lugar de agregarlas
Con Spring Boot 1, el spring.config.location
argumento agrega ubicaciones específicas en el entorno Spring.
Pero desde Spring Boot 2, spring.config.location
reemplaza las ubicaciones predeterminadas utilizadas por Spring por las ubicaciones especificadas en el entorno de Spring como se indica en la documentación .
Cuando las ubicaciones de configuración personalizadas se configuran mediante el uso
spring.config.location
, reemplazan las ubicaciones predeterminadas. Por ejemplo, si spring.config.location
se configura con el valor
classpath:/custom-config/
, file:./custom-config/
el orden de búsqueda se convierte en la siguiente:
file:./custom-config/
classpath:custom-config/
spring.config.location
ahora es una forma de asegurarse de que cualquier application.properties
archivo tenga que especificarse explícitamente.
Para los JAR súper que no deben empaquetar application.properties
archivos, eso es bastante bueno.
Para mantener el viejo comportamiento de spring.config.location
Spring Boot 2, puede usar la nueva spring.config.additional-location
propiedad en lugar de spring.config.location
que todavía agregue las ubicaciones como se indica en la documentación :
Alternativamente, cuando las ubicaciones de configuración personalizadas se configuran usando
spring.config.additional-location
, se usan además de las ubicaciones predeterminadas.
En la práctica
Supongamos que, como en la pregunta OP, tiene que especificar 2 archivos de propiedades externas y 1 archivo de propiedades incluido en el uber jar.
Para usar solo los archivos de configuración que especificó:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Para agregar archivos de configuración a estos en las ubicaciones predeterminadas:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
en el último ejemplo no es obligatorio ya que las ubicaciones predeterminadas tienen eso y las ubicaciones predeterminadas aquí no se sobrescriben sino que se extienden.
application.properties
siempre se cargará, conspring.config.location
usted puede agregar ubicaciones adicionales de configuración que se comprueban los archivos (que es cuando termina con una/
), sin embargo si se pone una coma separados ahí que apunta a los archivos de los que se cargará. Esto también se explica en la Guía de referencia de Spring Boot aquí