Definir perfil ativo e local de configuração na linha de comando na inicialização por mola

164

Eu tenho um aplicativo de inicialização de primavera.

Eu tenho três perfis em meu aplicativo-> desenvolvimento, preparo e produção . Então eu tenho 3 arquivos

  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml

Meu application.yml reside dentro src/main/resources. Eu configurei o perfil ativo em application.yml como:

spring:
  profiles.active: development

Os outros 3 arquivos de configuração específicos do perfil estão presentes na C:\configpasta.

Estou usando o plugin gradle para eclipse. Quando tento executar um " bootRun ", estou definindo os argumentos da linha de comando na minha configuração gradle no eclipse como

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

No entanto, a propriedade da linha de comando não está sendo refletida e meu perfil ativo está sempre sendo definido como desenvolvimento (que é o que eu mencionei no arquivo applications.yml). A pasta C: \ Config também não é procurada por arquivos de configuração específicos do perfil.

Acho que estou perdendo alguma coisa aqui. Eu tenho tentado descobrir isso nos últimos 2 dias. Mas sem sorte. Eu realmente apreciaria qualquer ajuda.

O-OF-N
fonte
Você pode adicionar sua bootRunlinha de comando também?
Biju Kunjummen
Eu estava executando o Eclipse e não a linha de comando até agora. Mas tentei executar usando "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" e obtive o mesmo resultado.
O de-N-

Respostas:

341

Existem duas maneiras diferentes de adicionar / substituir propriedades da mola na linha de comando.

Opção 1: Propriedades do sistema Java (argumentos da VM)

É importante que os parâmetros -D estejam antes do seu application.jar, caso contrário, eles não serão reconhecidos.

java -jar -Dspring.profiles.active=prod application.jar

Opção 2: argumentos do programa

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config
RenRen
fonte
45
Ordem dos parâmetros -D é realmente :) importante
martin
3
como você pode conseguir isso durante a implantação para dizer o Tomcat Container? Nesse caso, simplesmente coloquei minha guerra na pasta webapps do tomcat, como forneço as informações do perfil? definindo propriedades do sistema?
prayagupd
@prayagupd sim, você pode ter as propriedades do sistema definidas em seu bash_profile.
cumprimentos
2
@ maneesh sim, eu estou usando env variável SPRING_PROFILES_ACTIVE exportada via ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
Prayagupd 17/05/19
1
Quando você diz que a ordem é importante: Podemos passar nos dois argumentos: -Dspring.profile.active e -Dspring.config.location de modo que, o perfil seja definido de acordo com o primeiro argumento e o arquivo de propriedades seja escolhido de acordo com o segundo argumento? Por exemplo:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur
26

Minha prática recomendada é definir isso como um argumento "-D" da VM. Observe as diferenças entre a bota de mola 1.xe 2.x.

Os perfis a serem ativados podem ser especificados na linha de comandos:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

exemplo de uso com maven:

Spring-Boot 2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x

mvn spring-boot:run -Dspring.profiles.active=local

Separe-os com uma vírgula para vários perfis:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Sma Ma
fonte
Você quer dizer mola / bota? (Primavera 1x e Primavera 2x)!
smilyface
1
@smilyface spring boot. inicialização primavera também está disponível em diferentes versões: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
Eu uso o spring-boot 2.1.3, e -Dspring-boot.run.profiles=localnão funcionou, -Dspring.profiles.active=localfuncionou.
Donghua Liu
spring-boot 2.2.0: trabalhe ambos: -Dspring-boot.run.profilese-Dspring.profiles.active
Grigory Kislin
17

Eu tive que adicionar isso:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

E agora o bootRun seleciona o perfil e os locais de configuração.

Muito obrigado @ jst pelo ponteiro.

O-OF-N
fonte
7
Isso pode ser ainda mais simples da seguinte forma: bootRun { systemProperties = System.properties }. Este comando copiará todos os parâmetros passados ​​com o -Dswitch com as mesmas chaves para systemPropertymapear.
edufinn
esta parece ser uma solução única para gradle, não existe uma solução genérica?
User1767316
1
Onde exatamente você está adicionando isso? Em algum lugar do arquivo build.gradle ou em um local específico dentro do arquivo?
Scala Enthusiast
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

não está correto.

deveria estar:

--spring.profiles.active=staging --spring.config.location=C:\Config
Michael Yin
fonte
3
Isso faz com que erro "opção não reconhecido: --spring.config.location"
James Watkins
-D é a maneira correta de definir propriedades do sistema Java. - algo é um parâmetro do bash.
Xdg 06/04
trabalho --spring.profiles.active para mim, mesmo que eu encaminhados de docs.spring.io/spring-boot/docs/current/reference/html/...
Pushkar
Isso também funciona para mim ao usar Executar como -> Aplicativo Java no Eclipse
Olivier Boissé
11
na verdade, ambos estão corretos, isso depende de como ele é usado: pode ser java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarORjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi
9

você pode usar a seguinte linha de comando:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Rollen Holt
fonte
9

Há outra maneira de definir a variável do SO , SPRING_PROFILES_ACTIVE .

por exemplo:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Referência: Como definir perfis ativos do Spring

Rothin Sen
fonte
Sim, e isso evita a necessidade de mexer com a maneira como a Gradle passa as propriedades do sistema para o aplicativo.
Ben3000 #
Esta é a maneira elegante. Também deve ser usado para definir usuários, senhas e outras configurações confidenciais do banco de dados, para que não sejam verificados no controle de versão.
Igor Donin
7

Ao definir o perfil através do plug - in Maven, você deve fazê-lo viarun.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

Com a opção de depuração:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

Já vi essa viagem com muita gente ... espero que ajude

JARC
fonte
1
foi alterado para mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, consulte: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l Obrigado! que funciona para mim, acabei de atualizar um projeto a partir da Primavera de inicialização 1 a 2. Agora eu só adicioná-los todos no meu bashrc ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith
5

Acho que o seu problema provavelmente está relacionado ao seu local spring.config.l não terminando o caminho com "/".

Cite os documentos

Se spring.config.location contiver diretórios (ao contrário de arquivos), eles deverão terminar em / (e serão anexados aos nomes gerados a partir de spring.config.name antes de serem carregados).

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

jst
fonte
Obrigado por apontar. No entanto, quando executo -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ também apresenta o mesmo problema. Mesmo o perfil ativo não está sendo refletido. Eu acho que por algum motivo minha linha de comando não está sendo ignorada.
O de-N-
1
Você deve seguir o conselho dado nesta pergunta para passar os argumentos para inicializar o executável stackoverflow.com/questions/25079244/…
jst
Obrigado. Isso realmente ajudou.
O de-N-
4

A resposta de Michael Yin está correta, mas parece ser necessária uma explicação melhor!

Muitos de vocês mencionaram que -Dé a maneira correta de especificar parâmetros da JVM e estão absolutamente certos. Mas Michael também está certo, como mencionado em Perfis de inicialização do Spring documentação dos .

O que não está claro na documentação é o tipo de parâmetro: --spring.profiles.activenão é um parâmetro da JVM padrão; portanto, se você deseja usá-lo em seu IDE, preencha os campos corretos (por exemplo, argumentos do programa)

Eric Taix
fonte
0

Se você usa Gradle:

-Pspring.profiles.active=local
FredFlinstone
fonte