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 PropertySourceorden 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#propertiesatributo 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 RandomValuePropertySourceque tiene propiedades solo al azar. *.
Propiedades de aplicación específicas de perfil fuera de su jar empaquetado ( application-{profile}.propertiesy variantes de YAML).
Propiedades de aplicación específicas de perfil incluidas dentro de su jar ( application-{profile}.propertiesy variantes de YAML).
Propiedades de la aplicación fuera de su jar empaquetado ( application.propertiesy variantes YAML).
Propiedades de la aplicación empaquetadas dentro de su jar ( application.propertiesy variantes de YAML).
@PropertySourceanotaciones en tus @Configurationclases. 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}.propertiesy variantes de YAML).
Propiedades de la aplicación fuera de su jar empaquetado ( application.propertiesy variantes YAML).
@PropertySourceanotaciones en tus @Configurationclases. 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.propertiesarchivos (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.locationpropiedad 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.locationargumento agrega ubicaciones específicas en el entorno Spring.
Pero desde Spring Boot 2, spring.config.locationreemplaza 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.locationse 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.locationahora es una forma de asegurarse de que cualquier application.propertiesarchivo tenga que especificarse explícitamente.
Para los JAR súper que no deben empaquetar application.propertiesarchivos, eso es bastante bueno.
Para mantener el viejo comportamiento de spring.config.location Spring Boot 2, puede usar la nueva spring.config.additional-locationpropiedad en lugar de spring.config.locationque 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.propertiessiempre se cargará, conspring.config.locationusted 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í