Arquivo application.properties específico do ambiente no aplicativo Spring Boot [fechado]


87

No meu aplicativo Spring Boot, quero criar um arquivo de propriedades específicas do ambiente. O tipo de empacotamento do meu aplicativo está em guerra e estou executando-o no tomcat integrado. Eu uso sts e executo o principal a partir de sts.

  1. Posso ter o arquivo de propriedades específicas do ambiente, como o aplicativo - $ {env-value} .properties?

No caso acima, env-value terá valores como local / devl / test / prod

  1. Onde definir o arquivo env-value? Para local, posso defini-lo como o argumento jvm por meio de sts

  2. Quem lê o application.properties no aplicativo Spring Boot.

  3. Como carregar o arquivo de propriedades específicas do ambiente? Por ex - se eu definir o banco de dados uid, pwd, schema etc no arquivo de propriedade específico do ambiente, nesse caso a fonte de dados será capaz de entender as propriedades nele?

  4. Posso usar o arquivo application.properties e application-local.properties ao mesmo tempo?


Você leu isso ? Basicamente, é compatível com o uso imediato.
M. Deinum

Eu fiz, mas não está funcionando. Então, eu tenho o arquivo application.properties e o arquivo application-local.properties no mesmo local. O arquivo application-local.properties contém propriedades relacionadas ao banco de dados. application.properties tem uma única propriedade em relação ao mvc da mola. Também adicionei -Dprofile = local como configuração de depuração, mas este valor não está sendo coletado
user3534483

porque você precisa definir spring.active.profilespara usar -Dspring.active.profiles=local. em vez de.
M. Deinum

Sem sucesso, senhor. então, em vez de -Dprofile, agora estou usando -Dspring.active.profiles = local. E então, em meu arquivo de configuração, tento buscar o valor String driverClassName = env.getProperty ("driverClassName"); env é o Meio Ambiente da primavera
usuário3534483

1
Desculpe meu mal, misturei ao redor :).
M. Deinum

Respostas:


173

Spring Boot já tem suporte para propriedades baseadas em perfis .

Basta adicionar um application-[profile].propertiesarquivo e especificar os perfis a serem usados ​​usando a spring.profiles.activepropriedade.

-Dspring.profiles.active=local

Isso carregará o application.propertiese o application-local.propertiescom o último substituindo as propriedades do primeiro.


1
Podemos substituir o uso das propriedades do aplicativo por outro arquivo para o perfil específico sem carregar os dois? Para testes ou dev, por exemplo?
Hassam Abdelillah de

1
M. Deinum, eu também tenho um problema semelhante, tenho application.yml e application-qa.yml e dei -Dspring.profiles.active = qa, ambos os arquivos estão sendo lidos, mas as propriedades de application-qa.yml não estão substituindo propriedades de application.yml, estou sempre vendo propriedades apenas de application.yml? existe alguma maneira de especificar a prioridade?
Suresh


Estou escrevendo código para aws lambda e posso passar esta chave = valor como valor de ambiente - que pode ser acessado usando System.getenv () - funcionará?
Abdeali Chandanwala

Eu tenho 4 arquivo application- {profile} .properties. E eu quero executar o mesmo arquivo jar em ambiente diferente, digamos dev, test, prod. Portanto, não posso usar -Dspring.profiles.active = local. Por favor, corrija-me se eu estiver faltando alguma coisa.
Ashish Burnwal

25

Sim você pode. Como você está usando a primavera, verifique a @PropertySourceanotação.

Anote sua configuração com

@PropertySource("application-${spring.profiles.active}.properties")

Você pode chamá-lo do que quiser e adicionar vários arquivos de propriedades, se quiser. Pode ser bom se você tiver mais conjuntos e / ou padrões que pertencem a todos os ambientes (pode ser escrito com @PropertySource {..., ..., ...} também).

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

Então você pode iniciar o aplicativo com o ambiente

-Dspring.active.profiles=test

Neste exemplo, o nome será substituído por propriedades de teste do aplicativo e assim por diante.


3
O problema é que $spring.profiles.active}é uma string separada por matriz / vírgula. Portanto, ele pode não fazer o que você espera / deseja quando houver vários perfis ativos.
M. Deinum

Isso é verdade, mas funciona bem para dois perfis - um padrão e outro definido com PropertySource. Para um tratamento de propriedade mais avançado, acho que você terá que olhar para fora do Spring. Além disso, PropertySource só é lido durante a inicialização. Outras bibliotecas mais avançadas para manipulação de propriedades também podem alterar o tempo de execução das propriedades.
Tzen

2
Funcionou, mas ainda não entendo por que tive que fazer isso manualmente. Em um dos meus outros repositórios, não precisei fazer isso.
The Java Guy

7

podemos fazer assim:

em application.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

em application-test.yml :

server:
  port: 5000

e em application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

em seguida, o Spring Boot iniciará nosso aplicativo como desejamos.


2
Você não está codificando o perfil ativo desta forma ?? :(
Anna Medyukh

0

Meu ponto, desta maneira não está pedindo ao desenvolvedor para criar todo o ambiente relacionado de uma só vez, resultando em risco de expor a configuração de produção para o desenvolvedor final

de acordo com o fator 12, não deve ser específico do ambiente residir apenas no ambiente.

Como fazemos para CI CD

  • Construir o Spring uma vez e promover para outro ambiente, nesse caso, se tivermos o spring jar tem todo ambiente, haverá risco de segurança, tendo todas as variáveis ​​de ambiente no GIT
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.