当前位置: 首页 > 面试题库 >

Spring Boot:如何将另一个WAR文件添加到嵌入式tomcat?

通典
2023-03-14
问题内容

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

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

也许以下是正常过程:

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

但是,如果可以进行以下配置,那就太好了。

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


问题答案:

你可以使用将war文件添加到嵌入式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);
        }

    };
}


 类似资料:
  • Spring Boot的嵌入式tomcat对于开发和部署都非常方便。 但是,如果应该添加另一个(第三方)WAR文件(例如,GeoServer)怎么办? 安装普通Tomcat服务器。 将Spring Boot应用程序构建为WAR文件,并将其添加到Tomcat的webapps文件夹中。 还要向webapps文件夹中添加另一个(第三方)WAR文件。 但如果有以下配置可能就好了。 将Spring Boot

  • 我已经搜索了这个问题,但我没有找到任何关于这个案例的东西。我发现了很多“如何将Spring Boot WAR部署到Tomcat”,但是没有关于用Spring Boot包装现有的Tomcat WAR的内容。 我正在尝试用Spring Boot“包装器”包装一个现有的WAR,这样就不必重新配置现有的代码库。这个解决方案不起作用,因为它依赖于在绝对位置可用的WAR,而我们正试图将“应用程序”WAR打包在

  • 问题内容: 我有Web Maven项目。项目的输出是一个文件。我想将此文件添加为对project_b的依赖项。 project_b的文件,具有如下插件: 如何添加了与Web应用程序来project_b ,,和? 问题答案: 在Maven中,添加依赖关系只是小菜一碟。看下面的pom.xml。 设置以上依赖项与在project-apple中导入project-banana.jar相同。 现在,我有另一

  • val file=header.unionall(lines).todf()

  • 我正在尝试加载一个“WAR”文件到Spring Boot的嵌入式tomcat服务器。为此,我找到了这样的答案:Spring Boot:如何向嵌入式Tomcat添加另一个WAR文件? 但是在我这样做之后,我发现在这个问题上已经问过的错误:用嵌入的Tomcat部署现有的war,但是没有一个满意的答案。 注意:我知道这是一个重复的问题(我把链接),但当时没有足够的声誉添加一个评论,或能力与作者私下联系,

  • 我试图加载一个"war"文件到Spring Boot的嵌入式tomcat服务器。为此,我找到了这个答案:Spring Boot:如何向嵌入式tomcat添加另一个WAR文件? 但在我这么做之后,我发现在这个问题上已经出现了同样的错误:使用嵌入式Tomcat部署现有的war,但没有令人满意的答案。 注意:我知道这可以被看作是一个重复的问题(我放了链接),但当时没有足够的声誉添加评论,或者没有能力私下