为啥在部署到外部tomcat时需要扩展SpringBootServletInitializer
Posted
技术标签:
【中文标题】为啥在部署到外部tomcat时需要扩展SpringBootServletInitializer【英文标题】:Why it is necessary to extend`SpringBootServletInitializer` while deploying it to an external tomcat为什么在部署到外部tomcat时需要扩展SpringBootServletInitializer 【发布时间】:2018-06-11 09:19:04 【问题描述】:为什么我们应该扩展SpringBootServletInitializer
以便将SpringBoot
应用程序运行到外部tomcat
?
如果不扩展SpringBootServletInitializer
它在嵌入式tomcat 上运行,那么为什么在将其部署到外部tomcat 时需要扩展SpringBootServletInitializer
?
【问题讨论】:
【参考方案1】:较旧的 Servlet 容器不支持 Servlet 3.0 中使用的 ServletContextInitializer 引导过程。您仍然可以在这些容器中使用 Spring 和 Spring Boot,但您需要将 web.xml 添加到您的应用程序并配置它以通过 DispatcherServlet 加载 ApplicationContext .
为了创建可部署的war文件,需要提供一个SpringBootServletInitializer子类并覆盖它的configure方法。这利用了 Spring Framework 的 Servlet 3.0 支持,并允许您在应用程序由 servlet 容器启动时对其进行配置。通常,您更新应用程序的主类以扩展 SpringBootServletInitializer。
@SpringBootApplication
public class Application extends SpringBootServletInitializer
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
return application.sources(Application.class);
public static void main(String[] args)
SpringApplication.run(Application.class, args);
您可以参考以下链接
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
【讨论】:
一个问题.. 为什么我们需要这个功能受保护的 SpringApplicationBuilder 配置(SpringApplicationBuilder 应用程序)?没有这个功能,我的应用程序运行得很好。【参考方案2】:这里有更多信息:
为了部署基于Servlet
的Web 应用程序(如Spring
),您实际上需要提供传统的web.xml
。
我们也可以使用WebApplicationInitializer 接口以编程方式做同样的事情。根据文档
要在 Servlet 3.0+ 环境中实现的接口,以便 以编程方式配置 ServletContext - 而不是(或 可能与)传统的基于 web.xml 的方法结合使用。
正如 SpringBoot 建议使用 JavaConfiguration
而不是 xml configuration
。
它使用 JavaConfiguration 而不是 web.xml
。
它有SpringBootServletInitializer
类,最终实现WebApplicationInitializer
接口并覆盖其onStartup
来配置事物。
【讨论】:
以上是关于为啥在部署到外部tomcat时需要扩展SpringBootServletInitializer的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot在部署到Tomcat期间无法加载外部jar