Spring Boot的嵌入式tomcat非常便于开发和部署。
但是,如果应该添加另一个(第三方)WAR文件(例如GeoServer)怎么办?
也许以下是正常过程:
但是,如果可以进行以下配置,那将是很好的。
怎么做到呢?
更新
当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中。
您可以使用将战争文件添加到嵌入式Tomcat Tomcat.addWebapp。正如其javadoc所说,它是“相当于将Web应用程序添加到Tomcat的Web应用程序目录中”。要在Spring Boot中使用此API,您需要使用一个自定义TomcatEmbeddedServletContainerFactory子类:
Tomcat.addWebapp
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); } }; }