programing

Spring-Boot에서 실제 가동 중에 application.properties를 덮어쓰는 방법

batch 2023. 3. 7. 21:12
반응형

Spring-Boot에서 실제 가동 중에 application.properties를 덮어쓰는 방법

스프링 부츠랑application.properties개발 중에 데이터베이스를 선택하다@Configuration @Profile("dev").

spring.profiles.active=dev
spring.config.location=file:d:/application.properties

프로덕션 중에 로드해야 하는 응용 프로그램 컨텍스트 외부에 파일을 만든 후 d:/application.properties를 사용하여 다른 구성 프로파일을 활성화해야 합니다.

spring.profiles.active=production

결과: 앱을 시작할 때 구성이 그대로 유지됨dev따라서 프로덕션 속성 파일의 추가 위치는 고려되지 않습니다.내가 뭘 놓친거야?

스프링 부트 1.1.0빌드 스냅샷

주의: 이 질문은 Tomcat에 관한 것이 아닙니다.

어떻게 하는지 물어보셨겠지만, 대답은 이러면 안 된다는 거예요.

그 대신,application.properties,application-default.properties application-dev.propertiesarg를 통해 JVM으로 프로파일을 전환합니다.-Dspring.profiles.active=dev

또한 테스트 시 다음을 사용하여 몇 가지 사항을 재정의할 수 있습니다.@TestPropertySource

이상적으로는 모든 것이 전원 관리 상태에 있어야 합니다.서버 위치에 어떤 속성이 있고 어떤 속성이 누락되었는지 어떻게 알 수 있습니까?개발자가 새로운 것을 도입하면 어떻게 됩니까?

Spring Boot은 이미 이 기능을 제대로 수행하기 위한 충분한 방법을 제공하고 있습니다.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

를 사용할 수도 있습니다.@PropertySources

@PropertySources({
        @PropertySource(value = "classpath:application.properties"),
        @PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
})
public class Application {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

    }


}

프로파일을 동적으로 변경할 수 있을지 모르겠습니다.

spring.config.location 속성이 원하는 외부 위치로 설정된 내부 속성 파일과 spring.profiles.active 속성이 설정된 위치(항아리 외부)의 속성 파일만 있으면 됩니다.

또한 개발 프로파일(spring.dev.active=dev)에 고유한 내부 속성 파일을 가지고 그대로 두는 것이 좋습니다. 프로덕션 환경에 배포하려면 속성 파일의 새 위치(spring.dev.active=dev:

java -jar myjar.jar --spring.config.location=D:\wherever\application.properties

스프링 부츠 2부터는

--spring.config.additional-location=production.properties

Spring Boot 2.2.2로 업데이트합니다.풀어주다.

완전한 예: https://www.surasint.com/spring-boot-override-property-example/

jar 파일에는 다음 두 줄의 application.properties가 있다고 가정합니다.

server.servlet.context-path=/test
server.port=8081

그런 다음 프로덕션에서 server.port=8888을 재정의하지만 다른 속성은 재정의하지 않습니다.

먼저 다른 파일(ex override.properties)을 생성하여 다음 행을 온라인으로 만듭니다.

server.port=8888

그러면 이렇게 항아리를 시작할 수 있어요.

java -jar spring-boot-1.0-SNAPSHOT.jar --spring.config.location=classpath:application.properties,/opt/somewhere/override.properties

업데이트: 봄철 버그입니다.여기를 참조해 주십시오.

항아리 밖의 응용 프로그램 속성은 다음 중 하나에 있어야 합니다. 그러면 모든 것이 작동하게 됩니다.

21.2 Application property files
SpringApplication will load properties from application.properties files in the following    locations and add them to the Spring Environment:

A /config subdir of the current directory.
The current directory
A classpath /config package
The classpath root

예를 들어 cmd line args를 지정하지 않고 base app.location에서 spring.config.location을 사용하지 않을 경우 이 방법이 작동합니다.

d:\yourExecutable.jar
d:\application.properties

or

d:\yourExecutable.jar
d:\config\application.properties

spring external config 매뉴얼 참조

업데이트: \@Configuration을 \@PropertySource와 함께 사용할 수 있습니다.문서에 따르면 리소스를 어디에서나 지정할 수 있습니다.어떤 구성이 로딩되어 있는지 주의하여 운영 환경에서 확실하게 승리할 수 있도록 해야 합니다.

다음과 같은 것이 나에게 효과가 있음을 알게 되었습니다.

java -jar my-awesome-java-prog.jar --spring.config.location=file:/path-to-config-dir/

추가했습니다.

레이트 에디트

물론 이 명령줄은 실제 가동 상태에서는 실행되지 않습니다.

오히려 나는

  • 겹] [여러 겹]shell는, 「JAR」, 「JAR」의 「...」를 참조해 주세요.
  • ansibleshell스크립트와 플레이스 홀더를 실제 값으로 바꿉니다.

스프링 설정의 우선 순위는 다음과 같습니다.

  1. ServletConfig init 파라미터
  2. Servlet Context init 파라미터
  3. JNDI 속성
  4. System.getProperties()

따라서 설정을 변경하려면 명령줄에서 설정을 덮어씁니다.그러나 여러 프로파일을 사용할 수 있지만 재정의는 피하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/23563363/how-to-override-application-properties-during-production-in-spring-boot

반응형