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

Spring Boot" title="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. 将另一个(第三方)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:如何将另一个WAR文件添加到嵌入式tomcat? 的全部内容, 来源链接: utcz.com/qa/423169.html

回到顶部