maven - Spring Boot App 内嵌 Tomcat 如何在运行时加载外部 War 文件

标签 maven tomcat spring-boot

我正在尝试获取一个具有嵌入式 Tomcat 服务器的 Spring Boot jar,以在运行时加载外部 war 。我正在尝试使用此 post 中显示的技术来执行此操作.

Spring Boot应用中的容器bean:

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

外部 war 的Maven依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

当我启动 Spring Boot 容器应用程序时,容器 bean 找到 warfile 并将其添加到类路径,但随后抛出 ClassNotFoundException:

2017-01-13 15:14:22.520  INFO 208 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/first]  : 1 Spring WebApplicationInitializers detected on classpath
2017-01-13 15:14:22.520  INFO 208 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/first]  : Marking servlet jsp as unavailable
2017-01-13 15:14:22.520 ERROR 208 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/first]  : Servlet [jsp] in web application [/first] threw load() exception

java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1050) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:989) ~[tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4913) [tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5223) [tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) [tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) [tomcat-embed-core-8.5.6.jar!/:8.5.6]
    at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0_112]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_112]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_112]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_112]

我试过在 war 中包含带有 org.apache.jasper.servlet.JspServlet 的 jar 。我也尝试过使用 Spring Boot war(应用程序类扩展 SpringBootApplicationInitializer,打包到 war 并为 tomcat starter 依赖项提供提供的范围),这也给出了相同的错误。接受任何建议。

最佳答案

缺少 Tomcat-Jasper。根据您的 Spring Boot 使用的嵌入式 Tomcat 的版本,将以下依赖项添加到您的 pom.xml:

<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
  <version>8.5.5</version>
</dependency>

对于 Spring Boot 1.4.1.RELEASE,它是版本 8.5.5 ( Available versions of "tomcat-embed-jasper" )。

要在将依赖项添加到 Maven 后检查库是否存在,请打包您的应用程序。在打包的应用程序中,您会在

下找到它

\BOOT-INF\lib\tomcat-embed-jasper-8.5.5.jar

关于maven - Spring Boot App 内嵌 Tomcat 如何在运行时加载外部 War 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644131/

相关文章:

android - 使用 Gradle 的外部 Android 库项目

java - intellij idea - 无法在 linux 上运行 "Tomcat"项目

java - Spring Data Jpa不会自动获取下一个ID(PK),它总是从1开始

java - 使用 Spring 的 @Value 注释插入时如何避免截断零前导数字?

java - 如何跳过多 Maven 模块中的生命周期阶段

eclipse - Maven Eclipse 集成

java - Jadira 依赖导致 AbstractMethodError

wordpress - 如何在JSP中创建一个新闻博客系统?

tomcat - Tomcat 上的平均最大并发用户数

java - SpringBoot openJ9 Kubernetes崩溃InterpreterEmulator.cpp:208