programing

Spring Boot application.properties를 Tomcat/lib 폴더에 외부화하는 방법

yellowcard 2023. 3. 26. 10:03
반응형

Spring Boot application.properties를 Tomcat/lib 폴더에 외부화하는 방법

myapp1을 도입할 수 있는 구성이 필요합니다.tomcat/lib 폴더에서 구성 파일을 가져올 수 있는 war.같은 Tomcat: myapp2에 다른 웹 어플리케이션이 공존하고 있기 때문입니다.전쟁, myapp3.전쟁, 이 레이아웃이 필요해

tomcat/lib/myapp1/application.properties
tomcat/lib/myapp2/application.properties
tomcat/lib/myapp3/application.properties

이렇게 하면 전쟁 내에 속성 파일 없이 전쟁 파일을 작성하고 모든 서버에 배포할 수 있습니다.

Spring 매뉴얼은 읽었지만 jar로 실행할 때 위치를 설정하는 방법에 대해 설명합니다.

java -jar myapp.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

여러 개의 전쟁 파일이 공존하는 경우 어떻게 해야 할지 모르겠다.

이것이 가능한지 아니면 Spring Boot을 포기하고 기존의 Spring MVC 어플리케이션으로 돌아가야 하는지 알고 싶습니다.

질문에서 알 수 있듯이 application-{profile} 속성을 @PropertySource 주석으로 로드하는 방법이 있을 수 있지만 설명서에서 볼 수 있듯이 로깅 시스템이 작동하지 않습니다.

로깅 시스템은 응용 프로그램 수명 주기 초기에 초기화되므로 @PropertySource 주석을 통해 로드된 속성 파일에는 로깅 속성이 없습니다.

즉, application-{profiles.properties의 로깅 속성이 다음과 같이 됩니다.

logging.config=classpath:myapp1/logback.xml
logging.path = /path/to/logs
logging.file = myapp1.log

이 무시되고 로깅시스템이 동작하지 않습니다.

이 문제를 해결하기 위해 Spring Application Builder.properties() 메서드를 사용하여 어플리케이션이 설정되었을 때 처음에 속성을 로드했습니다.여기서 모든 애플리케이션 {profiles.properties를 로드하기 위해 Spring Boot에서 사용하는 'spring.config.location'을 설정합니다.

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }

    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.location", "classpath:myapp1/");
      return props;
   }
}

그런 다음 속성 파일을 src/main/resources에서 src/main/resources/myapp1로 이동했습니다.

.
├src
| └main
|   └resources
|     └myapp1
|       └application.properties
|       └application-development.properties
|       └logback.xml
└─pom.xml

pom.xml에서 임베디드 Tomcat 라이브러리의 범위를 "제공"으로 설정해야 합니다.또한 src/main/resources/myapp1의 모든 속성 파일을 최종 전쟁 대상에서 제외하고 구성이 필요 없는 배포 가능한 전쟁을 생성하려면 다음 절차를 수행합니다.

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <failOnMissingWebXml>false</failOnMissingWebXml>
            <packagingExcludes>
              **/myapp1/
            </packagingExcludes>
        </configuration>
    </plugin>

그리고 Tomcat에는

├apache-tomcat-7.0.59
 └lib
   ├─myapp1
   |  └application.properties        
   |  └logback.xml
   └─myapp2
     └application.properties
     └logback.xml

이제 설정 프리 워를 생성하여 apache-tomcat-7.0.59/webapps 폴더에 드롭할 수 있습니다.속성 파일은 클래스 경로를 사용하여 각 웹 앱에 대해 독립적으로 해결됩니다.

   apache-tomcat-7.0.59/lib/myapp1
   apache-tomcat-7.0.59/lib/myapp2
   apache-tomcat-7.0.59/lib/myapp3

Spring 4.2 및 @Annotation 구성 및 Linux 서버에서의 Tomcat 사용

Application 클래스에서 다음과 같이 @PropertySource를 설정합니다.

@Configuration
@EnableWebMvc
@PropertySource(value = { "classpath:application-yourapp.properties"})
@ComponentScan(basePackages = "com.yourapp")
public class YourAppWebConfiguration extends WebMvcConfigurerAdapter {

    ...
}

이제 클래스 경로에 속성 파일을 포함시키면 됩니다.

실가동중

.war 파일(또는 anything)을 Tomcat에 배포하고 application-yourapp.properties를 운영 시스템에 배치합니다.( /opt / config folder / application - yourapp . properties " ) 。

다음으로 Tomcat(여기서는 Tomcat 7)에서bin\catalina.sh

이 라인이 있습니다.

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

application.properties가 포함된 폴더의 경로를 추가합니다.

CLASSPATH=:/opt/applyconfigfolder

클래스 경로 정의가 이미 있는 경우 추가할 수 있습니다.

CLASSPATH=:/opt/applyconfigfolder:/yourpath1:/yourpath2:

창문을 사용해 본 적은 없지만 문제는 없다고 생각합니다.

개발 중(일식 포함)

├src
| └main
|   └ ....
└config
| └application-yourapp.properties

대신src/main/resources/application-yourapp.properties

여기서 config 폴더를 classpath에 추가하고 Tomcat 서버(또는 동등한 서버)의 "Run Configurations"로 이동하여 Config 폴더를 사용자 엔트리에 추가합니다.

여기에 이미지 설명 입력

이상입니다. application.properties는 어플리케이션에서 제외되어 개발 환경에서 프로젝트가 완벽하게 실행됩니다.

Daniel Mora는 좋은 솔루션을 제공했지만 spring.config.location 대신 spring.config.name을 사용할 수 있습니다.따라서 동일한 Tomcat/lib 디렉토리에 서로 다른 웹 앱에 대해 서로 다른 속성 파일을 가질 수 있습니다.

    public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder
                .sources(Application.class)
                .properties(getProperties());
    }
    public static void main(String[] args) {

        SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class)
                .sources(Application.class)
                .properties(getProperties())
                .run(args);
    }

   static Properties getProperties() {
      Properties props = new Properties();
      props.put("spring.config.name", "myapp1");
      return props;
   }
}

lib 디렉토리는 서드파티 라이브러리용이지 웹 앱의 구성 속성을 저장하기 위한 것이 아니라고 생각합니다.따라서 conf/catalina.properties의 shared.loader 속성을 사용하여 외부 폴더를 클래스 경로 폴더로 추가하는 것이 더 낫다고 생각합니다.

shared.disples=${displina.base}/공유/정보

응용 프로그램 속성 app1.properties, app2.properties, ecc를 넣을 수 있습니다.apache-various-7.0.59/shared/contributions에 포함되어 있습니다.

SpringBootServlet 구성 메서드의 Daniel Mora 솔루션을 찾기 전에initializer의 솔루션은 src/main/webapp/META-INF에 context.xml을 추가하는 것이었습니다.

<Context>
    <Environment name="spring.config.name" value="myapp1" type="java.lang.String" override="false" description="define the property file for srping boot application"/>
</Context>

언급URL : https://stackoverflow.com/questions/31017064/how-to-externalize-spring-boot-application-properties-to-tomcat-lib-folder

반응형