programing

속성과 함께 시작된 Spring-boot(프로파일별) 응용 프로그램에서 응용 프로그램 속성 재정의 문제런처

codeshow 2023. 8. 10. 21:44
반응형

속성과 함께 시작된 Spring-boot(프로파일별) 응용 프로그램에서 응용 프로그램 속성 재정의 문제런처

클래스 경로의 프로필별 응용 프로그램 속성 파일에 선언된 속성을 파일 시스템의 재정의 파일에 선언된 다른 값으로 재정의하는 데 어려움이 있습니다.

으로 구성된 응용 프로그램 Spring-boot 사용)이 .@EnableAutoconfiguration) 여러 개의 프로필을 가지고 있으며, 이 프로필을 사용하여 시작합니다.PropertiesLauncherJarLauncher(배포 제약과 관련된 이유 - 아카이브가 아닌 분해된 디렉토리를 읽기 전용 파일 시스템에 배포해야 합니다.)

애플리케이션 루트 내에는 다음과 같은 프로파일별 애플리케이션 속성이 있습니다.

application-dev.properties
application-qa.properties
application-prd.properties

그리고 논쟁을 위해 말하자면,application-dev.properties포함:

foo.bar=baz
foo.baz=other

모든 환경에서 기존 속성을 재정의하고 없는 속성(예: 프로덕션 암호)을 제공해야 할 수 있습니다. 문제는 이미 선언된 속성을 재정의하는 것입니다.application-${profile}.properties클래스 경로에 있는 파일입니다. (클래스 경로 파일에 없는 속성을 제공해도 문제가 되지 않습니다.)

다음과 같은 파일 시스템 위치에 재정의 속성 파일이 있다고 가정합니다.

/local/appname/dev/overrides/application.properties

속성인 재을무하싶습니다고효를 .foo.bar재산을 뿐만 아니라, 새재을신뿐만아니라할고산▁a,,라,foo.password.

따라서 재정의 파일 내용은 다음과 같습니다.

foo.bar=overridden-value
foo.password=something

응용 프로그램을 시작할 때 다음과 같은 명령줄을 사용합니다.

java -Dspring.config.location=file:/local/appname/dev/overrides/ 
     -Dspring.profiles.active=dev 
     org.springframework.boot.loader.PropertiesLauncher 
     --debug &

제가 보고 있는 문제는 비록foo.password에 신고되지 않은 재산.application-dev.properties파일이 픽업됨, 재정의foo.bar - 무당함시 - 여히값보입다니이전,,여보입다▁value▁the▁is,bazapplication-dev.properties가보다는치,overridden-value/local/appname/dev/overrides/application.properties.

--debug옵션이 활성화되면, 나는 볼 수 있습니다.ConfigFileApplicationListener오버라이드 파일(파일 시스템에서)과 프로파일별 파일(클래스 경로에서)을 순서대로 로드했는지 기록합니다.

오버라이드 파일이 먼저 나열되기 때문에 먼저 로드되고 나중에 나열되는 클래스 경로의 '기본' 프로필 관련 파일에 의해 재정의된다는 순진한 결론에 매료됩니다.하지만 로그에 나열된 순서가 반드시 행동과 관련이 있는 것은 아닙니다.그리고 저는 도로에 명시된 경로의 순서를 바꾸려고 노력했습니다.spring.config.location 재산서, 래그서.classpath:앞에나됨 앞에 .file:...에서 "Spring-boot"에 검색된다는 때문에이 되지 도 않습니다. 사용자가 값을 제공하더라도spring.config.location.

Spring-boot 설명서는 Spring-boot 실행 파일 JAR에 대해 속성이 확인되는 순서에 대해 다음과 같이 매우 구체적입니다.

  1. 명령줄 인수입니다.
  2. 시스템 Java 시스속성템((System.getProperties()).
  3. OS 환경 변수.
  4. JNDI 특성의 :java:comp/env
  5. A RandomValuePropertySource에만 .random.*.
  6. 포장된 병 외부의 응용 프로그램 속성(application.propertiesYAML 및 프로필 변형 포함).
  7. 병 내부에 패키지된 응용 프로그램 속성(application.propertiesYAML 및 프로필 변형 포함).
  8. @PropertySource에 있는 @Configuration반.
  9. " " " (" " " " 를 하여 지정됨)SpringApplication.setDefaultProperties).

6행과 7행 - 병 내부 속성 에 있는 외부 속성을 기록합니다.

제가 보기에는 설명되지 않았고, 제 혼란/문제의 원인일 수도 있는 것은 JAR을 사용하지 않고 분해된 디렉토리(따라서)를 사용할 때 발생하는 일입니다.PropertiesLauncher.)

것과 한다면, 저는 분된디에의동면것일다대명시, 다선속값있수다기니습성할을대에 할 수 ./local/appname/dev/overrides/application.properties에 선언된 합니다.classpath:application-dev.properties하지만 이것은 사실이 아닌 것 같습니다.

Spring-boot Spring-boot C.4)에도 있습니다.PropertiesLauncher는 에 입니다.loader.home'...'라고 표현되는 재산[the] 추가 속성 파일의 위치(예: /opt/app((으)로 ${user.dir})'.

그래서 사용해봤습니다.loader.homespring.config.location하지만 소용이 없습니다.

(업데이트:저는 또한 사용해봤습니다.loader.config.location그리고 저는 두 가지 메모가 있습니다. 디렉토리보다는 파일을 원하는 것 같습니다. (그래서 그 행동은 와 유사하지 않습니다.)spring.config.location), 그리고 상위 디렉터리가 아닌 파일 경로를 제공했지만 여전히 도움이 되지 않았습니다.)

제가 무엇을 잘못하고 있는지, 또는 제가 어떤 잘못된 가정을 하고 있는지 알아챌 수 있는 사람이 있습니까?

고마워요, 데이브, 당신의 제안은 100% 옳았어요.

파이변경우는경하에서 속성 을 바꾸면,/local/appname/dev/overridesapplication-dev.properties그러면 해당 파일의 속성 값이 의 속성 값보다 우선합니다.classpath:application-dev.properties.

어제 이 조합을 사용해 본 적이 있다고 확신했지만, 작동을 멈춘 것은 제가 이 조합을 지정하면서 놀고 있을 때라고 생각합니다.spring.config.location그리고 그것을 잘못 이해했기 때문에 그것은 올바른 위치에서 재정의 파일을 찾지 않았습니다.

언급URL : https://stackoverflow.com/questions/26662381/issue-overriding-application-properties-in-spring-boot-profile-specific-applic

반응형