Spring Boot 指南提供了创建可运行的 jars 的代码,但是我们也可以使用它来构建 war 文件,如{{3} }。基本上,它要求我们将包装指定为war,删除嵌入式tomcat服务器依赖项,并像这样扩展SpringBootServletInitializer
类:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
我的问题是为什么我们也需要提供一个main方法,因为仅当我们要运行jar时才需要main方法。
我试图删除此main方法,但编译失败,提示该插件找不到主类。
答案 0 :(得分:2)
在同一页面(11.3.3):
我们应用程序的最后一部分是main方法。这只是遵循Java约定的应用程序入口点的标准方法。我们的主要方法通过调用run委托给Spring Boot的SpringApplication类。 SpringApplication会引导我们的应用程序,并启动Spring,后者反过来又会启动自动配置的Tomcat Web服务器。我们需要将Example.class作为参数传递给run方法,以告诉SpringApplication哪个是主要的Spring组件。 args数组也通过传递以公开任何命令行参数。
有关public static void main
及其与ServletContainerInitializer
的关系的进一步信息:
https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html
为什么应该对SpringBootServletInitializer进行子类化? 为了生成可部署的war文件,我们必须提供一个SpringBootServletInitializer子类并覆盖其configure方法。
...主类正在扩展SpringBootServletInitializer,后者又扩展了WebApplicationInitializer。 WebApplicationInitializer基于Servlet 3.0 ServletContainerInitializer概念。 此扩展的目的是:WebApplicationInitializer设置Servlet上下文,并另外要求子类设置SpringApplication的源(用@SpringBootApplication注释的类),以便它可以使用有效的调用SpringApplication#run()。源,并可以进行自动配置和应用程序级bean连接等。仅当将应用程序作为war文件部署在servlet容器中时,才需要这种安排。在Web容器中,当然“主方法”无法获得就像在独立的爆炸应用程序或可执行jar或war中一样执行。