Eu tenho vários arquivos de propriedades que quero carregar do caminho de classe. Há um conjunto padrão no /src/main/resources
qual faz parte myapp.jar
. Meu springcontext
espera que os arquivos estejam no caminho de classe. ie
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
Também preciso da opção de substituir essas propriedades por um conjunto externo. Eu tenho uma pasta de configuração externa cwd
. Conforme a pasta de configuração do documento de inicialização da primavera, a pasta deve estar no caminho de classe. Mas não está claro no doc se ele substituirá apenas o applicaiton.properties
de lá ou todas as propriedades em config.
Quando o testei, apenas application.properties
é apanhada e o restante das propriedades ainda são apanhadas /src/main/resources
. Tentei fornecê-los como lista separada por vírgulas, spring.config.location
mas o conjunto padrão ainda não está sendo substituído.
Como faço para que vários arquivos de configuração externos substituam os padrão?
Como solução alternativa, usei atualmente app.config.location
(propriedade específica do aplicativo) que forneço através da linha de comando. ie
java -jar myapp.jar app.config.location=file:./config
e mudei applicationcontext
para
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
E é assim que faço a separação entre arquivo e caminho de classe ao carregar o aplicativo.
EDITAR% S:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Eu realmente gostaria de não usar a solução alternativa acima e o Spring substitui todos os arquivos de configuração externos no caminho de classe, como acontece com o application.properties
arquivo.
fonte
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 aquiRespostas:
Ao usar o Spring Boot, as propriedades são carregadas na seguinte ordem (consulte Configuração externalizada no guia de referência do Spring Boot).
Ao resolver propriedades (ou seja, a
@Value("${myprop}")
resolução é feita na ordem inversa (iniciando com 9)).Para adicionar arquivos diferentes, você pode usar as
spring.config.location
propriedades que usam uma lista separada por vírgula de arquivos de propriedade ou local do arquivo (diretórios).O acima irá adicionar um diretório que será consultado para
application.properties
arquivos.Isso adicionará o arquivo de 2 propriedades aos arquivos carregados.
Os arquivos e locais de configuração padrão são carregados antes dos especificados adicionalmente
spring.config.location
, o que significa que os últimos sempre substituirão as propriedades definidas nos anteriores. (Consulte também esta seção do Guia de Referência do Boot Spring).ATUALIZAÇÃO: como o comportamento de spring.config.location agora substitui o padrão em vez de adicionar a ele. Você precisa usar spring.config.additional-location para manter os padrões. Essa é uma alteração no comportamento de 1.x para 2.x
fonte
application.properties
eapplication-[env].properties
. Não leva em consideração outros arquivos de propriedades. Isso também é afirmado no guia de referência (na seção ao qual o link leva e na citação do guia de referência).config.location
econfig.names
interagir, embora provavelmente pareça claro para as pessoas que já sabem como interagem. Você pode atualizar sua resposta para adicionar algo à documentação?spring.config.location
agora substitui o padrão em vez de adicionar a ele. Você precisa usarspring.config.additional-location
para manter os padrões. Essa é uma alteração no comportamento de 1.x para 2.x.Com a inicialização do Spring, o spring.config.location funciona, basta fornecer arquivos de propriedades separados por vírgula.
veja o código abaixo
pode-se colocar a versão padrão do jdbc.properties dentro do aplicativo. As versões externas podem ser configuradas aqui.
Com base no valor do perfil configurado usando a propriedade spring.profiles.active, o valor de jdbc.host será escolhido. Então, quando (no Windows)
O jdbc.host terá o valor de jdbc-dev.properties.
para
jdbc.host terá valor de jdbc.properties.
fonte
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:Para especificar arquivos de propriedades externas, essas opções devem interessar:
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: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 deapplication.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:
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 .spring.config.location
Agora é uma maneira de garantir que qualquerapplication.properties
arquivo precise ser especificado explicitamente.Para JARs uber que não devem empacotar
application.properties
arquivos, isso é bastante agradável.Para manter o comportamento antigo de
spring.config.location
usar o Spring Boot 2, você pode usar a novaspring.config.additional-location
propriedade em vez despring.config.location
ainda adicionar os locais, conforme declarado na documentaçã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:
Para adicionar arquivos de configuração a eles nos locais padrão:
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.fonte
application.properties
com todos os parâmetros e vários${file_name}.properties
com conjuntos de propriedades parciais definidos. Portanto, se você usar@PropertySource
ou outros links fortes para arquivos, poderá criar outro arquivo externo e substituir essas propriedades (por exemplo: declasspath:file.properties
).Dê uma olhada no PropertyPlaceholderConfigurer, acho mais claro que a anotação.
por exemplo
fonte
esta é uma abordagem simples usando a bota de mola
TestClass.java
o contexto app.properties , em seu local selecionado
seu aplicativo de inicialização de primavera
e o application.properties predefinido contexto
você pode escrever quantas classes de configuração desejar e habilitar / desabilitar apenas definindo spring.profiles.active = o nome do perfil / nomes {separados por vírgulas}
como você pode ver, a inicialização por mola é ótima, ela precisa de algum tempo para se familiarizar, vale a pena mencionar que você também pode usar o @Value em seus campos
fonte
Eu tive o mesmo problema. Eu queria ter a capacidade de substituir um arquivo de configuração interno na inicialização por um arquivo externo, semelhante à detecção application.properties do Spring Boot. No meu caso, é um arquivo user.properties onde os usuários dos meus aplicativos estão armazenados.
Minhas exigências:
Carregue o arquivo nos seguintes locais (nesta ordem)
Eu vim com a seguinte solução:
Agora, o aplicativo usa o recurso de caminho de classe, mas também procura por um recurso nos outros locais. O último recurso que existe será escolhido e usado. Consigo iniciar meu aplicativo com java -jar myapp.jar --properties.location = / directory / myproperties.properties para usar um local de propriedades que flutua no meu barco.
Um detalhe importante aqui: use uma String vazia como valor padrão para o properties.location na anotação @Value para evitar erros quando a propriedade não estiver configurada.
A convenção para um properties.location é: Use um diretório ou um caminho para um arquivo de propriedades como properties.location.
Se você deseja substituir apenas propriedades específicas, um PropertiesFactoryBean com setIgnoreResourceNotFound (true) pode ser usado com a matriz de recursos definida como locais.
Tenho certeza de que esta solução pode ser estendida para lidar com vários arquivos ...
EDITAR
Aqui está minha solução para vários arquivos :) Como antes, isso pode ser combinado com um PropertiesFactoryBean.
fonte
A inicialização por mola nos permite escrever perfis diferentes para ambientes diferentes, por exemplo, podemos ter arquivos de propriedades separados para ambientes de produção, qa e locais
O arquivo application-local.properties com configurações de acordo com minha máquina local é
Da mesma forma, podemos escrever application-prod.properties e application-qa.properties quantos arquivos de propriedades desejarmos
depois escreva alguns scripts para iniciar o aplicativo em diferentes ambientes, por exemplo
fonte
Acabei de ter um problema semelhante a esse e finalmente descobri a causa: o arquivo application.properties tinha os atributos incorretos de propriedade e rwx. Portanto, quando o tomcat inicializou, o arquivo application.properties estava no local certo, mas de propriedade de outro usuário:
fonte
Uma versão modificada da solução @mxsb que nos permite definir vários arquivos e, no meu caso, são arquivos yml.
Na minha aplicação-dev.yml, adicionei esta configuração que me permite injetar todos os yml que possuem -dev.yml. Essa também pode ser uma lista de arquivos específicos. "caminho da classe: /test/test.yml, caminho da classe: /test2/test.yml"
Isso ajuda a obter um mapa de propriedades.
No entanto, se assim for no meu caso, eu queria dividir arquivos yml para cada perfil e carregá-los e injetá-los diretamente na configuração de primavera antes da inicialização dos beans.
... Você entendeu a ideia
O componente é um pouco diferente
}
fonte
Se você deseja substituir os valores especificados no arquivo application.properties, é possível alterar o perfil ativo enquanto executa o aplicativo e criar um arquivo de propriedades do aplicativo para o perfil. Então, por exemplo, vamos especificar o perfil ativo "substituir" e, supondo que você tenha criado seu novo arquivo de propriedades do aplicativo chamado "application-override.properties" em / tmp, poderá executar
Os valores especificados em spring.config.location são avaliados na ordem inversa. Portanto, no meu exemplo, o classpat é avaliado primeiro, depois o valor do arquivo.
Se o arquivo jar e o arquivo "application-override.properties" estiverem no diretório atual, você poderá simplesmente usar
desde que o Spring Boot encontre o arquivo de propriedades para você
fonte
Eu descobri que esse é um padrão útil a seguir:
Aqui substituímos o uso de "application.yml" para usar "application-MyTest_LowerImportance.yml" e também "application-MyTest_MostImportant.yml"
(o Spring também procurará arquivos .properties)
Também estão incluídas como um bônus extra as configurações de depuração e rastreamento, em uma linha separada para que você possa comentá-las, se necessário;]
A depuração / rastreamento é incrivelmente útil, pois o Spring despeja os nomes de todos os arquivos que ele carrega e daqueles que ele tenta carregar.
Você verá linhas como esta no console em tempo de execução:
fonte
Eu tive muitos problemas ao tentar descobrir isso. Aqui está minha configuração,
Env Dev: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE
O que eu descobri é que a primavera está aderindo ao conceito "Padrões sensíveis para configuração". O que isso significa é que você precisa ter todos os seus arquivos de propriedades como parte do seu arquivo de guerra. Uma vez lá, você pode substituí-los usando a propriedade da linha de comando "--spring.config.additional-location" para apontar para arquivos de propriedades externas. Mas isso NÃO funcionará se os arquivos de propriedades não fizerem parte do arquivo de guerra original.
Código de demonstração: https://github.com/gselvara/spring-boot-property-demo/tree/master
fonte