gpt4 book ai didi

Spring 启动 : How to add another WAR files to the embedded tomcat?

转载 作者:IT老高 更新时间:2023-10-28 13:46:33 25 4
gpt4 key购买 nike

Spring Boot 的嵌入式 tomcat 非常方便,无论是开发还是部署。

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

也许以下是正常的程序:

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

但如果可以进行以下配置就好了。

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

怎么做?

更新

spring boot应用用fat jar(=executable 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);
}

};
}

由于系统类加载器无法加载 fat jar 中的 jar 文件,因此必须指定显式父类加载器。否则,附加的 WAR 无法加载添加了 WAR 的 spring boot 应用的 fat jar 中的库 jar。

最佳答案

您可以使用Tomcat.addWebapp 将war 文件添加到嵌入式Tomcat。正如其 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 启动 : How to add another WAR files to the embedded tomcat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com