복붙노트

[SPRING] 스프링 부트 : 임베디드 바람둥이에 다른 WAR 파일을 추가하는 방법은 무엇입니까?

SPRING

스프링 부트 : 임베디드 바람둥이에 다른 WAR 파일을 추가하는 방법은 무엇입니까?

스프링 부트의 임베디드 톰캣은 개발과 배포 모두에 매우 편리합니다.

하지만 다른 (제 3 자) WAR 파일 (예 : GeoServer)을 추가해야한다면 어떻게해야할까요?

다음은 일반적인 절차입니다.

그러나 다음 구성이 가능하면 좋을 것입니다.

어떻게 할 수 있습니까?

최신 정보

스프링 부트 애플리케이션이 fat jar (= 실행 가능한 jar)로 만들어 졌을 때, 응답의 코드가 충분하지 않습니다. 수정 된 내용은 다음과 같습니다.

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            try {
                Context context = tomcat.addWebapp("/foo", "/path/to/foo.war");
                WebappLoader loader =
                    new WebappLoader(Thread.currentThread().getContextClassLoader());
                context.setLoader(loader);
            } catch (ServletException ex) {
                throw new IllegalStateException("Failed to add webapp", ex);
            }
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }

    };
}

fat jar의 jar 파일은 시스템 클래스 로더에 의해로드 될 수 없으므로 명시 적 상위 클래스 로더를 지정해야합니다. 그렇지 않으면 추가 WAR은 WAR를 추가 한 스프링 부팅 응용 프로그램의 팻말에 라이브러리 jar를로드 할 수 없습니다.

해결법

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

    1.Tomcat.addWebapp를 사용하여 포함 된 Tomcat에 war 파일을 추가 할 수 있습니다. javadoc에 따르면, "Tomcat의 웹 응용 프로그램 디렉토리에 웹 응용 프로그램을 추가하는 것과 동일합니다". Spring Boot에서이 API를 사용하려면 사용자 정의 TomcatEmbeddedServletContainerFactory 하위 클래스를 사용해야합니다.

    Tomcat.addWebapp를 사용하여 포함 된 Tomcat에 war 파일을 추가 할 수 있습니다. javadoc에 따르면, "Tomcat의 웹 응용 프로그램 디렉토리에 웹 응용 프로그램을 추가하는 것과 동일합니다". Spring Boot에서이 API를 사용하려면 사용자 정의 TomcatEmbeddedServletContainerFactory 하위 클래스를 사용해야합니다.

    @Bean
    public EmbeddedServletContainerFactory servletContainerFactory() {
        return new TomcatEmbeddedServletContainerFactory() {
    
            @Override
            protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                    Tomcat tomcat) {
                // Ensure that the webapps directory exists
                new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs();
    
                try {
                    Context context = tomcat.addWebapp("/foo", "/path/to/foo.war");
                    // Allow the webapp to load classes from your fat jar
                    context.setParentClassLoader(getClass().getClassLoader());
                } catch (ServletException ex) {
                    throw new IllegalStateException("Failed to add webapp", ex);
                }
                return super.getTomcatEmbeddedServletContainer(tomcat);
            }
    
        };
    }
    
  2. from https://stackoverflow.com/questions/31374726/spring-boot-how-to-add-another-war-files-to-the-embedded-tomcat by cc-by-sa and MIT license