Spring boot 1.X e Spring Boot 2.X não fornecem as mesmas opções e comportamento sobre o Externalized Configuration.
A resposta muito boa de M. Deinum refere-se às especificações da Bota de Primavera 1.
Vou atualizar para o Spring Boot 2 aqui.
Origens e ordem das propriedades do ambiente
O Spring Boot 2 usa uma PropertySourceordem muito específica , projetada para permitir a substituição sensata de valores. As propriedades são consideradas na seguinte ordem:
Propriedades de configurações globais do Devtools em seu diretório pessoal (~ / .spring-boot-devtools.properties quando o devtools está ativo).
@TestPropertySource anotações em seus testes.
@SpringBootTest#propertiesatributo de anotação em seus testes. Argumentos de linha de comando.
Propriedades de SPRING_APPLICATION_JSON(JSON embutido incorporado em uma variável de ambiente ou propriedade do sistema).
ServletConfig parâmetros init.
ServletContext parâmetros init.
Atributos JNDI de java:comp/env.
Propriedades do sistema Java ( System.getProperties()).
Variáveis de ambiente do SO.
A RandomValuePropertySourceque possui propriedades apenas aleatoriamente. *.
Propriedades de aplicativo específicas do perfil fora do seu jar empacotado ( application-{profile}.propertiese variantes YAML).
Propriedades de aplicativo específicas do perfil empacotadas dentro do seu jar ( application-{profile}.propertiese variantes YAML).
Propriedades do aplicativo fora do seu jar empacotado ( application.propertiese variantes YAML).
Propriedades do aplicativo empacotadas dentro do seu jar ( application.propertiese variantes YAML).
@PropertySourceanotações em suas @Configurationaulas. Propriedades padrão (especificadas pela configuração
SpringApplication.setDefaultProperties).
Para especificar arquivos de propriedades externas, essas opções devem interessar:
Propriedades de aplicativo específicas do perfil fora do seu jar empacotado ( application-{profile}.propertiese variantes YAML).
Propriedades do aplicativo fora do seu jar empacotado ( application.propertiese variantes YAML).
@PropertySourceanotações em suas @Configurationaulas. Propriedades padrão (especificadas pela configuração
SpringApplication.setDefaultProperties).
Você pode usar apenas uma dessas 3 opções ou combiná-las de acordo com seus requisitos.
Por exemplo, para casos muito simples, usar apenas propriedades específicas do perfil é suficiente, mas em outros casos, convém usar as propriedades específicas do perfil, as propriedades padrão e@PropertySource .
Locais padrão para arquivos application.properties
Sobre application.propertiesarquivos (e variante), por padrão, o Spring os carrega e adiciona suas propriedades no ambiente a partir deles na seguinte ordem:
Um subdiretório / config do diretório atual
O diretório atual
Um pacote classpath / config
A raiz do caminho de classe
As prioridades mais altas são tão literalmente:
classpath:/,classpath:/config/,file:./,file:./config/.
Como usar arquivos de propriedades com nomes específicos?
Os locais padrão nem sempre são suficientes: os locais padrão, como o nome do arquivo padrão ( application.properties), podem não ser adequados. Além disso, como na pergunta OP, pode ser necessário especificar vários arquivos de configuração além de application.properties(e variante).
Então spring.config.namenão será suficiente.
Nesse caso, você deve fornecer um local explícito usando a spring.config.locationpropriedade environment (que é uma lista separada por vírgula de locais de diretório ou caminhos de arquivo).
Para ser livre sobre o padrão de nomes de arquivos, favorece a lista de caminhos de arquivos sobre a lista de diretórios.
Por exemplo, faça assim:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Dessa forma, é a mais detalhada que apenas especifica a pasta, mas também é a maneira de especificar muito bem nossos arquivos de configuração e documentar claramente as propriedades efetivamente usadas.
O spring.config.location agora substitui os locais padrão em vez de adicioná-los
Com o Spring Boot 1, o spring.config.locationargumento adiciona locais especificados no ambiente Spring.
Porém, a partir do Spring Boot 2, spring.config.locationsubstitui os locais padrão usados pelo Spring pelos locais especificados no ambiente Spring, conforme indicado na documentação .
Quando os locais de configuração personalizados são configurados usando
spring.config.location, eles substituem os locais padrão. Por exemplo, se spring.config.locationestiver configurado com o valor
classpath:/custom-config/, file:./custom-config/a ordem de pesquisa torna-se o seguinte:
file:./custom-config/
classpath:custom-config/
spring.config.locationAgora é uma maneira de garantir que qualquer application.propertiesarquivo precise ser especificado explicitamente.
Para JARs uber que não devem empacotarapplication.properties arquivos, isso é bastante agradável.
Para manter o comportamento antigo de spring.config.locationusar o Spring Boot 2, você pode usar a nova spring.config.additional-locationpropriedade em vez de spring.config.locationainda adicionar os locais, conforme declarado na documentação :
Como alternativa, quando locais de configuração personalizados são configurados usando
spring.config.additional-location, eles são usados além dos locais padrão.
Na prática
Então, supondo que, como na pergunta OP, você tenha 2 arquivos de propriedades externas para especificar e 1 arquivo de propriedades incluídos no uber jar.
Para usar apenas os arquivos de configuração especificados:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Para adicionar arquivos de configuração a eles nos locais padrão:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties não é necessário no último exemplo, pois os locais padrão têm isso e esses locais padrão não são substituídos, mas estendidos.
application.propertiessempre será carregado, comspring.config.locationvocê poderá adicionar locais de configuração adicionais que são verificados quanto a arquivos (ou seja, quando termina com a/), no entanto, se você colocar uma lista separada por vírgulas, indicando os arquivos que serão carregados. Isso também é explicado no Spring Boot Reference Guide aqui