小编典典

如何将war文件部署到独立安装在Spring Boot应用程序的内置Tomcat服务器中?[重复]

spring-boot

Spring Boot的嵌入式tomcat非常便于开发和部署。

但是,如果应该添加另一个(第三方)WAR文件(例如GeoServer)怎么办?

也许以下是正常过程:

  1. 安装普通的Tomcat服务器。
  2. 将Spring Boot应用程序构建为WAR文件,并将其添加到Tomcat的webapps文件夹中。
  3. 还将另一个(第三方)WAR文件添加到webapps文件夹中。

但是,如果可以进行以下配置,那将是很好的。

  1. 将Spring引导应用程序构建为独立的Jar,其中包括嵌入式Tomcat。
  2. 部署Spring引导应用程序Jar。
  3. 将另一个(第3方)WAR文件添加到嵌入式Tomcat可以识别的文件夹中。
  4. 使用嵌入式Tomcat服务Spring Boot应用程序内容和另一个WAR内容。

怎么做到呢?

更新

当Spring Boot应用程序由胖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);
        }

    };
}

由于胖jar中的jar文件无法由系统类加载器加载,因此必须指定一个显式的父类加载器。否则,附加的WAR无法将库jar加载到添加了WAR的Spring
Boot应用程序的胖jar中。


阅读 469

收藏
2020-05-30

共1个答案

小编典典

您可以使用将战争文件添加到嵌入式Tomcat
Tomcat.addWebapp。正如其javadoc所说,它是“相当于将Web应用程序添加到Tomcat的Web应用程序目录中”。要在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);
        }

    };
}
2020-05-30