java为什么SpringBootMaven插件需要一个主类来打包war?
Spring Boot指南给出了创建可运行的JAR的代码,但是我们也可以使用它来构建war文件,正如here所解释的那样。基本上,它要求我们将打包指定为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方法
我试图删除这个主方法,但是编译失败了,因为插件找不到主类
# 1 楼答案
从同一页(11.3.3)中:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#getting-started-first-application-main-method
我们应用程序的最后一部分是main方法。对于应用程序入口点,这只是一个遵循Java约定的标准方法。我们的主要方法通过调用run来委托SpringBoot的SpringApplication类。SpringApplication引导我们的应用程序,启动Spring,然后启动自动配置的TomcatWeb服务器。我们需要以身作则。类作为run方法的参数,告诉SpringApplication哪个是主要的Spring组件。args数组也被传递以公开任何命令行参数
有关
public static void main
及其与ServletContainerInitializer
关系的更多信息:https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html
为什么SpringBootServletilizer应该被子类化? 为了生成可部署的war文件,我们必须提供SpringBootServletilizer子类并重写其配置方法
。。。主要类是扩展SpringBootServletInitializer,后者反过来扩展WebApplicationInitializer。WebApplicationInitializer基于Servlet3.0 ServletContainerInitializer概念此扩展的目的是:WebApplicationInitializer设置servlet上下文,此外它还要求子类设置SpringApplication的源(用@SpringBootApplication注释的类),因此,它可以使用有效源调用SpringApplication#run(),并可以进行自动配置和应用程序级bean连接等。只有当应用程序作为war文件部署在servlet容器中时,才需要这种安排在web容器中,当然“main方法”不能像在独立的爆炸式应用程序、可执行jar或war中那样执行