복붙노트

[SPRING] Spring 용 Tomcat 웹 서버에서 application.properties를 외부화하는 방법은 무엇입니까?

SPRING

Spring 용 Tomcat 웹 서버에서 application.properties를 외부화하는 방법은 무엇입니까?

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

질문 : Tomcat 서버에서 war 파일을 실행할 때 : d : \ application.properties와 같은 classpath 또는 tomcat 컨테이너 외부의 application.properties에 대한 추가 위치를 추가하려면 어떻게해야합니까?

맞춤 위치는 위의 위치와 관련하여 가장 높은 우선 순위를 가져야합니다.

문제는 : 물론 explruct war / tomcat webapps 폴더 안에 / config 폴더를 추가 할 수 있지만 webapps 폴더가 정리되고 전쟁이 재배포되면 사용자 지정 구성이 손실됩니다.

따라서 외부에 추가 위치를 추가하고 싶습니다.

해결법

  1. ==============================

    1.application.properties 파일이 들어있는 폴더를 가리키는 spring_config_location 환경 변수를 설정할 수 있습니다.

    application.properties 파일이 들어있는 폴더를 가리키는 spring_config_location 환경 변수를 설정할 수 있습니다.

    Tomcat의 경우 /bin/setenv.sh 파일에 다음 행을 추가하여이 작업을 수행 할 수 있습니다 (누락 된 경우 파일 작성).

    export spring_config_location=/usr/local/tomcat/conf/
    

    해당 폴더에 특성 파일을 놓으십시오. 여러 개의 앱이있는 경우 각 앱의 속성 파일 이름을 고유하게 설정할 수 있습니다. 스프링 부트 App을 위해 나는 이렇게했습니다 :

    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            System.setProperty("spring.config.name", "my-app");
            SpringApplication.run(MyApplication.class, args);
        }
    }
    

    BOOT로 실행할 때 새 이름이 선택됩니다. Tomcat에도 배포 할 때 이름을 설정하려면 SpringBootServletInitializer의 configure를 다음과 같이 덮어 씁니다.

    public class ServletInitializer extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(MyApplication.class).properties("spring.config.name: my-app");
        }
    
    }
    

    그런 다음 my-app.properties와 같은 등록 정보 파일의 이름을 지정하십시오. 디폴트 이름 대신에 Spring은 그것을 찾을 것입니다. 샘플의 모든 폴더 / usr / local / tomcat / conf /에 모든 응용 프로그램 속성 파일을 저장할 수 있습니다. 외부 속성이 우선 적용됩니다. 우선 순위는 다음을 참조하십시오. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

    최신 정보

    Spring Boot 2 이후 spring_config_location의 동작이 변경되었습니다 (마이그레이션 가이드 참조).

    따라서 유스 케이스를 기반으로 환경 변수로 설정할 속성을 고려해야합니다. 새 파일은 setenv.sh에서 spring_config_additional-location과 비슷해야합니다. 파일을 찾는 위치는 참조 문서에도 설명되어 있습니다.

  2. ==============================

    2.저에게 가장 쉬운 방법은 컨텍스트 파일을 Tomcat의 config 폴더에 넣는 것입니다. 예를 들어 응용 프로그램이 루트 경로 (예 : http://your_domain.com/)에서 실행중인 경우 [path_to_your_tomcat] /conf/Catalina/localhost/ROOT.xml 파일을 만들어야합니다. 응용 프로그램이 다른 경로 (예 : http://your_domain.com/example_path)에서 실행되는 경우 파일의 이름은 [path_to_your_tomcat] /conf/Catalina/localhost/example_path.xml과 같아야합니다. 이 파일 안에는 하드 드라이브의 어느 곳에 나 배치 할 수있는 외부 application.properties 파일에 대한 경로를 지정할 수 있습니다.

    저에게 가장 쉬운 방법은 컨텍스트 파일을 Tomcat의 config 폴더에 넣는 것입니다. 예를 들어 응용 프로그램이 루트 경로 (예 : http://your_domain.com/)에서 실행중인 경우 [path_to_your_tomcat] /conf/Catalina/localhost/ROOT.xml 파일을 만들어야합니다. 응용 프로그램이 다른 경로 (예 : http://your_domain.com/example_path)에서 실행되는 경우 파일의 이름은 [path_to_your_tomcat] /conf/Catalina/localhost/example_path.xml과 같아야합니다. 이 파일 안에는 하드 드라이브의 어느 곳에 나 배치 할 수있는 외부 application.properties 파일에 대한 경로를 지정할 수 있습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
        <Environment name="spring.config.location" value="file:/path/to/your/application/properties/file/" type="java.lang.String"/>
    </Context>
    
  3. ==============================

    3.몇 번이나해야만했고, 컨테이너에서 클래스 경로 리소스로 외부 디렉토리를 구성하는 것이 가장 좋은 방법이었습니다.

    몇 번이나해야만했고, 컨테이너에서 클래스 경로 리소스로 외부 디렉토리를 구성하는 것이 가장 좋은 방법이었습니다.

    그런 다음 디렉토리에 외부화하려는 자원을 배치하면 모든 것이 올바르게 실행됩니다. 봄에 리소스를로드하려면 다음과 같이하면됩니다.

    <beans:bean id="externalProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <beans:property name="location" value="classpath:[my-application-name]/applicationProperties.properties" />
                <beans:property name="placeholderPrefix" value="!applicationProperties{" />
                <beans:property name="placeholderSuffix" value="}" />
            </beans:bean>
    

    각 바람둥이에 여러 응용 프로그램을 배포하려는 경우, 클래스 패스에 설정 한 폴더에 디렉토리 구조를 만들고 각 war 응용 프로그램마다 다른 application.properties를 유지할 수 있음을 알 수 있습니다

    스프링 설정에서 응용 프로그램 이름 섹션을 dinamically 유지하려는 경우, 패키지 단계 (maven) 또는 응용 프로그램 컨텍스트 경로를 사용하는 등 여러 가지 방법으로이를 수행 할 수 있습니다

  4. ==============================

    4.마지막으로 보안 속성을 외부화하기 위해 다음 속성을 추가했습니다.

    마지막으로 보안 속성을 외부화하기 위해 다음 속성을 추가했습니다.

    spring.config.additional-location = / etc / tomcat / /application-production.properties

  5. from https://stackoverflow.com/questions/41461786/how-to-externalize-application-properties-in-tomcat-webserver-for-spring by cc-by-sa and MIT license