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 PropertySource
ordem 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#properties
atributo 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 RandomValuePropertySource
que possui propriedades apenas aleatoriamente. *.
Propriedades de aplicativo específicas do perfil fora do seu jar empacotado ( application-{profile}.properties
e variantes YAML).
Propriedades de aplicativo específicas do perfil empacotadas dentro do seu jar ( application-{profile}.properties
e variantes YAML).
Propriedades do aplicativo fora do seu jar empacotado ( application.properties
e variantes YAML).
Propriedades do aplicativo empacotadas dentro do seu jar ( application.properties
e variantes YAML).
@PropertySource
anotações em suas @Configuration
aulas. 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}.properties
e variantes YAML).
Propriedades do aplicativo fora do seu jar empacotado ( application.properties
e variantes YAML).
@PropertySource
anotações em suas @Configuration
aulas. 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.properties
arquivos (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.name
não será suficiente.
Nesse caso, você deve fornecer um local explícito usando a spring.config.location
propriedade 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.location
argumento adiciona locais especificados no ambiente Spring.
Porém, a partir do Spring Boot 2, spring.config.location
substitui 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.location
estiver 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.location
Agora é uma maneira de garantir que qualquer application.properties
arquivo 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.location
usar o Spring Boot 2, você pode usar a nova spring.config.additional-location
propriedade em vez de spring.config.location
ainda 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.properties
sempre será carregado, comspring.config.location
você 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