2016-12-16 1 views
2

내 WAR 어플리케이션이 비 스프링 라이브러리 (JSF 용)를 사용합니다. 라이브러리는 servletContext.getResource("page.html")을 사용하여 초기화됩니다. page.html은 WEB-INF/lib의 JAR 파일에 있으며 META-INF/resources/page.html임베디드 서블릿 컨테이너가 스프링 부트의 META-INF/resources를 처리하지 않습니다.

으로 패키지되어 있습니다. 서블릿 컨테이너에 WAR를 배포 할 때 우수한 기능을합니다. 하지만 실행 WAR로 응용 프로그램을 실행할 때 포함 된 서블릿 컨테이너가 클래스 경로 META-INF/resources를 검사하지 않기 때문에 작동하지 않습니다. 물러 클래스 패스 리소스 관리자에 대한 예를 들어

사용되지 않습니다 질문에 대한

private ResourceManager getDocumentRootResourceManager() { 
    File root = getCanonicalDocumentRoot(); 
    if (root.isDirectory()) { 
     return new FileResourceManager(root, 0); 
    } 
    if (root.isFile()) { 
     return new JarResourceManager(root); 
    } 
    return ResourceManager.EMPTY_RESOURCE_MANAGER; 
} 

https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/java/org/springframework/boot/context/embedded/undertow/UndertowEmbeddedServletContainerFactory.java#L466

시간 : 임베디드 서블릿 컨테이너가 META-INF/resources을 무시하는 이유는 무엇입니까? 실행 가능한 Servlet 3.0 애플리케이션을 만드는 것은 문제입니다.

유사 문제 :

Embedded Tomcat, executable jar, ServletContext.getRealPath()

https://github.com/spring-projects/spring-boot/issues/4218

+0

저는 스프링 부트를 많이 사용했지만 이전에 실행 가능한 전쟁에 대해 들어 보지 못했습니다. 그게 얼마나 도움이되는지 궁금하네요. – eis

답변

1

나는 다음과 같은 구성으로 내 문제를 해결 : 일반적으로

@Bean 
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() { 
    UndertowEmbeddedServletContainerFactory factory = 
    new UndertowEmbeddedServletContainerFactory(); 
    factory.addDeploymentInfoCustomizers(new UndertowDeploymentInfoCustomizer() { 

     @Override 
     public void customize(DeploymentInfo deploymentInfo) { 
      deploymentInfo.setResourceManager(
       new ClassPathResourceManager(deploymentInfo.getClassLoader(), 
        "META-INF/resources")); 
    }); 
    return factory; 
} 

, 나는 그것이 어떻게 임베디드 웹 컨테이너 동작합니다을 underdocumented하고 있다고 생각 . Spring 부트 개발자는 embedding 된 웹 컨테이너가 애플리케이션의 일부 기능을 제공하고, 기존 애플리케이션을 마이그레이션하는 사람들은 임베디드 컨테이너가 일반 컨테이너의 모든 기능을 제공 할 것으로 기대하고 있습니다. 예를 들어, ServletContainerInitializers는 임베디드에서 무시됩니다. https://github.com/spring-projects/spring-boot/issues/321

관련 문제