Spring Boot 애플리케이션의 환경 별 application.properties 파일 [닫힌]


85

내 Spring Boot 애플리케이션에서 환경 별 속성 파일을 만들고 싶습니다. 전쟁에서 내 응용 프로그램의 패키징 유형이며 임베디드 Tomcat에서 실행 중입니다. 나는 sts를 사용하고 sts 자체에서 메인을 실행합니다.

  1. application-$ {env-value} .properties와 같은 환경 특정 속성 파일을 가질 수 있습니까?

위의 경우 env-value는 local / devl / test / prod와 같은 값을 갖습니다.

  1. env-value 파일은 어디에 설정합니까? 로컬의 경우 sts를 통해 jvm 인수로 설정할 수 있습니다.

  2. Spring Boot 애플리케이션에서 application.properties를 읽는 사람.

  3. 환경 별 속성 파일을로드하는 방법은 무엇입니까? 예를 들어-환경 특정 속성 파일에서 데이터베이스 uid, pwd, 스키마 등을 설정하면 데이터 소스가 속성을 이해할 수 있습니까?

  4. application.properties와 application-local.properties 파일을 동시에 사용할 수 있습니까?


당신은 읽고 ? 기본적으로 기본적으로 지원됩니다.
M. Deinum

하지만 작동하지 않습니다. 그래서 같은 위치에 application.properties 파일과 application-local.properties 파일이 있습니다. application-local.properties 파일에는 db 관련 속성이 포함되어 있습니다. application.properties에는 spring mvc와 관련된 단일 속성이 있습니다. 또한 내가 -Dprofile 디버그 구성과 지역 =하지만이 값이 집어지고 있지 않습니다 추가
user3534483

설정해야 spring.active.profiles하므로 -Dspring.active.profiles=local. 대신.
M. Deinum 2015-08-25

성공하지 못했습니다. 그래서 -Dprofile 대신 -Dspring.active.profiles = local을 사용하고 있습니다. 그런 다음 구성 파일에서 String driverClassName = env.getProperty ( "driverClassName"); 값을 가져 오려고합니다. ENV는 봄부터 환경입니다
user3534483

1
미안 해요.
M. Deinum 2015-08-25

답변:


170

봄 부팅 이미 지원이 에 대한 프로필 을 기반으로 속성을.

application-[profile].properties파일을 추가 하고 spring.profiles.active속성 을 사용하여 사용할 프로필을 지정하기 만하면 됩니다.

-Dspring.profiles.active=local

이것은로드 application.properties와를 application-local.properties처음부터 후자의 최우선 속성.


1
둘 다로드하지 않고 특정 프로필에 대한 다른 파일로 응용 프로그램 속성 사용을 재정의 할 수 있습니까? 예를 들어 테스트 또는 개발?
Hassam Abdelillah

1
M. Deinum, 저도 비슷한 문제가 있습니다. application.yml과 application-qa.yml이 있고 -Dspring.profiles.active = qa를주었습니다. 두 파일은 모두 읽혀 지지만 application-qa.yml의 속성은 덮어 쓰지 않습니다. application.yml의 속성, 나는 항상 application.yml의 속성을보고 있습니까? 우선 순위를 지정하는 방법이 있습니까?
Suresh Chaganti

5
안녕하세요 둘 다, 이것은 당신의 문제를 해결할 수 있습니다. docs.spring.io/spring-boot/docs/current/reference/html/… 예 : mkyong.com/spring-boot/…
Anand Varkey Philips

aws lambda에 대한 코드를 작성 중이며이 key = value를 System.getenv ()를 사용하여 액세스 할 수있는 환경 값으로 전달할 수 있습니다. 작동합니까?
Abdeali Chandanwala

4 개의 application- {profile} .properties 파일이 있습니다. 그리고 다른 환경에서 동일한 jar 파일을 실행하고 싶습니다. dev, test, prod라고합시다. 그래서 나는 -Dspring.profiles.active = local을 사용할 수 없습니다. 내가 뭔가를 놓친 경우 친절하게 정정하십시오.
Ashish Burnwal

24

그래 넌 할수있어. Spring을 사용하고 @PropertySource있으므로 주석을 확인하십시오 .

구성에 주석 달기

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

원하는대로 호출 할 수 있으며 원하는 경우 여러 속성 파일을 추가 할 수 있습니다. 모든 환경에 속하는 더 많은 세트 및 / 또는 기본값이 있으면 좋을 수 있습니다 (@PropertySource {..., ..., ...}로도 작성할 수 있음).

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

그런 다음 환경으로 응용 프로그램을 시작할 수 있습니다.

-Dspring.active.profiles=test

이 예에서 이름은 application-test-properties 등으로 대체됩니다.


2
문제는 $spring.profiles.active}배열 / 쉼표로 구분 된 문자열입니다. 따라서 여러 프로필이 활성화되어있을 때 예상 / 원하는 작업을 수행하지 못할 수 있습니다.
M. Deinum

사실이지만 두 개의 프로필 (기본값 하나와 PropertySource로 정의 된 하나)에 대해 잘 작동합니다. 고급 속성 처리를 위해서는 Spring 외부를 살펴 봐야한다고 생각합니다. 또한 PropertySource는 시작 중에 만 읽습니다. 속성 처리를위한 다른 고급 라이브러리도 런타임에 속성을 변경할 수 있습니다.
Tzen

2
이것은 효과가 있었지만 왜 수동으로 해야하는지 이해하지 못합니다. 다른 저장소 중 하나에서는이 작업을 수행 할 필요가 없었습니다.
자바 가이

7

다음과 같이 할 수 있습니다.

application.yml :

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

에서 응용 프로그램 test.yml :

server:
  port: 5000

그리고 application-local.yml에서 :

server:
  address: 0.0.0.0
  port: 8080

그러면 스프링 부트가 원하는대로 앱을 시작합니다.


2
이런 식으로 활성 프로필을 하드 코딩하지 않습니까 ?? :(
Anna Medyukh 19-12-20

0

My Point, IN은 개발자에게 단일 이동으로 관련된 모든 환경을 생성하도록 요청하는 방식이 아니므로 최종 개발자에게 프로덕션 구성이 노출 될 위험이 있습니다.

12-Factor에 따라 특정 환경이 환경에만 상주해서는 안됩니다.

CI CD는 어떻게합니까

  • Spring을 한 번 빌드하고 다른 환경으로 승격하십시오.이 경우 spring jar가 모든 환경을 가지고 있다면 GIT에 모든 환경 변수를 갖는 보안 위험이 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.