스프링 부트의 명령 줄에서 활성 프로파일 및 구성 위치 설정


164

스프링 부트 응용 프로그램이 있습니다.

내 응용 프로그램-> 개발, 준비 및 생산에 세 가지 프로필이 있습니다. 3 개의 파일이 있습니다

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

application.yml 은 안에 src/main/resources있습니다. application.yml에서 활성 프로파일을 다음과 같이 설정했습니다.

spring:
  profiles.active: development

다른 3 개의 프로파일 특정 구성 파일은 C:\config폴더에 있습니다.

일식에 gradle 플러그인을 사용하고 있습니다. " bootRun "을 시도 할 때 , gradle 구성에서 명령 줄 인수를 일식으로 설정합니다.

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

그러나 명령 줄 속성이 반영되지 않고 활성 프로필이 항상 개발로 설정됩니다 (applications.yml 파일에서 언급 한 것). 또한 C : \ Config 폴더는 프로파일 특정 구성 파일을 검색하지 않습니다.

여기에 뭔가 빠진 것 같습니다. 지난 2 일 동안 알아 내려고 노력했습니다. 그러나 운이 없다. 정말 도움을 주셔서 감사합니다.


당신은 당신의 추가시겠습니까 bootRun또한 명령 줄을
비주 Kunjummen에게

나는 지금까지 명령 줄이 아닌 일식에서 실행 중이었습니다. 그러나 "gradle bootRun -Dspring.config.location = C : \ Config \ -Dspring.profiles.active = staging"을 사용하여 실행을 시도한 결과 동일한 결과를 얻었습니다.
O-OF-N

답변:


342

명령 행에서 스프링 특성을 추가 / 재정의 할 수있는 두 가지 방법이 있습니다.

옵션 1 : Java 시스템 특성 (VM 인수)

-D 매개 변수는 application.jar 앞에 있어야합니다. 그렇지 않으면 인식되지 않습니다.

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

옵션 2 : 프로그램 인수

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c : \ config

45
-D 매개 변수의 순서는 정말 중요합니다 :)
martin

3
바람둥이 컨테이너라고 말하면서 어떻게 이것을 달성 할 수 있습니까? 이 경우 나는 단순히 tomcat의 webapps 폴더에 전쟁을 넣었습니다. 어떻게 프로파일 정보를 제공합니까? 시스템 속성을 설정하여?
prayagupd

@prayagupd 예, bash_profile에서 시스템 속성을 설정할 수 있습니다.
최고의 소원을

2
@maneesh 예, 를 통해 내 보낸 env 변수 SPRING_PROFILES_ACTIVE 를 사용하고 ~/.bash_profile있습니다. export SPRING_PROFILES_ACTIVE=e2e
prayagupd

1
순서가 중요하다고 말할 때 : -Dspring.profile.active 및 -Dspring.config.location args를 모두 전달할 수 있습니다. 그러면 첫 번째 인수에 따라 프로파일이 설정되고 특성 파일이 두 번째 인수? 예 :java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur 21:09의

26

최선의 방법은 이것을 VM "-D"인수로 정의하는 것입니다. 스프링 부트 1.x와 2.x의 차이점에 유의하십시오.

사용할 프로파일은 명령 행에서 지정할 수 있습니다.

스프링 부트 2.x

-Dspring-boot.run.profiles=local

스프링 부트 1.x

-Dspring.profiles.active=local

maven 사용 예 :

스프링 부트 2.x

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

스프링 부트 1.x

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

여러 프로필의 경우 쉼표로 구분해야합니다.

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

spring / spring-boot? (봄 1x와 봄 2x)!
smilyface

1
@smilyface 스프링 부트. 스프링 부트는 다른 버전으로도 제공됩니다 : mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma

2
spring-boot 2.1.3을 사용 -Dspring-boot.run.profiles=local했는데 작동하지 않았습니다 -Dspring.profiles.active=local.
Donghua Liu

봄 부팅 2.2.0 : 작업 모두 : -Dspring-boot.run.profiles-Dspring.profiles.active
그리고 리 Kislin

17

나는 이것을 추가해야했다 :

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"
}

이제 bootRun은 프로필 및 구성 위치를 선택합니다.

포인터에 대해 @jst에게 감사드립니다.


7
다음과 같이 더 간단 할 수 있습니다 bootRun { systemProperties = System.properties }. 이 명령은 -D스위치와 함께 전달 된 모든 매개 변수를 동일한 키로 복사 하여 systemProperty매핑합니다.
edufinn

이것은 gradle 전용 솔루션 인 것 같습니다. 일반적인 솔루션이 없습니까?
user1767316

1
이것을 정확히 어디에 추가하고 있습니까? build.gradle 파일 또는 파일 내의 특정 위치에 있습니까?
스칼라 애호가

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

정확하지 않습니다.

해야한다:

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

3
이로 인해 "인식 할 수없는 옵션 : --spring.config.location"오류가 발생 함
James Watkins

-D는 Java 시스템 특성을 설정하는 올바른 방법입니다. --something은 bash 매개 변수입니다.
Xdg

--spring.profiles.active 저를 위해 일했습니다. docs.spring.io/spring-boot/docs/current/reference/html/
Pushkar

으로 실행을 사용하는 경우이 또한 나를 위해 작동 -> 이클립스에서 자바 응용 프로그램
올리비에 Boissé

11
이 될 수 있습니다 실제로 둘 다 그것을 사용하는 방법에 따라, 올바른 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
덱스터 스페

9

다음 명령 줄을 사용할 수 있습니다.

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar

9

OS 변수 SPRING_PROFILES_ACTIVE를 설정하여 다른 방법이 있습니다 .

예를 들어 :

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

참조 : 활성 스프링 프로파일 설정 방법


예. 그래야 Gradle이 시스템 속성을 응용 프로그램에 전달하는 방식으로 문제를 해결할 필요가 없습니다.
ben3000

이것은 깔끔한 방법입니다. 또한 데이터베이스 사용자와 비밀번호 및 기타 민감한 구성을 설정하여 버전 제어에서 체크인되지 않도록하는 데 사용해야합니다.
Igor Donin

7

Maven 플러그인 을 통해 프로파일을 설정할 때run.jvmArguments

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

디버그 옵션으로 :

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

나는이 여행을 많은 사람들을 보았습니다.


1
로 변경되었습니다 mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l

@ rwenz3l 감사합니다! 저에게 효과적입니다. Spring Boot 1에서 2로 프로젝트를 업그레이드했습니다. 이제 bashrc에 모두 추가했습니다. springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith

5

문제가 아마도 "/"로 끝나지 않는 spring.config.location과 관련이 있다고 생각합니다.

문서 인용

spring.config.location에 파일과 달리 디렉토리가 포함 된 경우 디렉토리는 /로 끝나야합니다 (로드되기 전에 spring.config.name에서 생성 된 이름이 추가됨).

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


지적 해 주셔서 감사합니다. 그러나 -Dspring.profiles.active = staging -Dspring.config.location = C : \ Config \를 실행하면 동일한 문제가 발생합니다. 활성 프로파일조차도 반영되지 않습니다. 어떤 이유로 내 명령 줄이 전달되지 않는다고 생각합니다.
O-OF-N

1
당신은 bootRun에 인수를 전달하는이 질문에 주어진 조언을 따라야합니다 stackoverflow.com/questions/25079244/...
JST

감사합니다. 정말 도움이되었습니다.
O-OF-N

4

Michael Yin의 답변은 정확하지만 더 나은 설명이 필요한 것 같습니다!

많은 사람들 -D이 이것이 JVM 매개 변수를 지정하는 올바른 방법 이라고 언급했으며 절대적으로 옳습니다. 그러나 Spring Boot Profiles 문서 에서 언급했듯이 Michael도 옳습니다 .

문서에서 명확하지 않은 것은 매개 변수의 종류입니다 --spring.profiles.active. 표준 JVM 매개 변수가 아니므로 IDE에서 사용하려면 올바른 필드 (예 : 프로그램 인수)를 채우십시오


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.