Java 为什么SpringBootMaven插件需要一个主类来打包war?

Java 为什么SpringBootMaven插件需要一个主类来打包war?,java,spring,spring-boot,spring-boot-maven-plugin,Java,Spring,Spring Boot,Spring Boot Maven Plugin,Spring Boot指南给出了创建可运行的JAR的代码,但是我们也可以使用它来构建war文件,正如所解释的那样。基本上,它要求我们将打包指定为war,删除嵌入式tomcat服务器依赖项,并扩展SpringBootServletilizer类,如下所示: @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringAppl

Spring Boot指南给出了创建可运行的JAR的代码,但是我们也可以使用它来构建war文件,正如所解释的那样。基本上,它要求我们将打包指定为war,删除嵌入式tomcat服务器依赖项,并扩展
SpringBootServletilizer
类,如下所示:

@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方法

我试图删除此主方法,但编译失败,因为插件找不到主类。

来自同一页面(11.3.3):

我们应用程序的最后一部分是main方法。对于应用程序入口点,这只是一个遵循Java约定的标准方法。我们的主要方法通过调用run来委托SpringBoot的SpringApplication类。SpringApplication引导我们的应用程序,启动Spring,然后启动自动配置的TomcatWeb服务器。我们需要将Example.class作为参数传递给run方法,告诉SpringApplication哪个是主要的Spring组件。args数组也被传递以公开任何命令行参数

有关
publicstaticvoidmain
及其与
servletcontainerinInitializer
的关系的更多信息:

为什么SpringBootServletilizer应该被子类化? 为了生成可部署的war文件,我们必须提供SpringBootServletilizer子类并重写其配置方法

。。。主要类是扩展SpringBootServletInitializer,后者反过来扩展WebApplicationInitializer。WebApplicationInitializer基于Servlet3.0 ServletContainerInitializer概念此扩展的目的是:WebApplicationInitializer设置servlet上下文,此外它还要求子类设置SpringApplication的源代码(用@SpringBootApplication注释的类),以便调用SpringApplication#run()有一个有效的源代码,可以进行自动配置和应用程序级bean连接等。只有当应用程序作为war文件部署在servlet容器中时,才需要这种安排。在web容器中,当然“main method”不能像在独立的分解应用程序或可执行jar或jar中那样执行战争。

来自同一页(11.3.3):

我们应用程序的最后一部分是main方法。对于应用程序入口点,这只是一个遵循Java约定的标准方法。我们的主要方法通过调用run来委托SpringBoot的SpringApplication类。SpringApplication引导我们的应用程序,启动Spring,然后启动自动配置的TomcatWeb服务器。我们需要将Example.class作为参数传递给run方法,告诉SpringApplication哪个是主要的Spring组件。args数组也被传递以公开任何命令行参数

有关
publicstaticvoidmain
及其与
servletcontainerinInitializer
的关系的更多信息:

为什么SpringBootServletilizer应该被子类化? 为了生成可部署的war文件,我们必须提供SpringBootServletilizer子类并重写其配置方法


。。。主要类是扩展SpringBootServletInitializer,后者反过来扩展WebApplicationInitializer。WebApplicationInitializer基于Servlet3.0 ServletContainerInitializer概念此扩展的目的是:WebApplicationInitializer设置servlet上下文,此外它还要求子类设置SpringApplication的源代码(用@SpringBootApplication注释的类),以便调用SpringApplication#run()有一个有效的源代码,可以进行自动配置和应用程序级bean连接等。只有当应用程序作为war文件部署在servlet容器中时,才需要这种安排。在web容器中,当然“main method”不能像在独立的分解应用程序或可执行jar或war中那样执行。

它既不是自动配置的Tomcat服务器,也不是通过java-jar运行应用程序。为什么我们需要这个主类呢?Maven插件是为配合Spring Boot而设计的。Spring Boot假设存在一个
公共静态void main
方法,因为Spring Boot声明的部分意图是让应用程序更容易入门。因此,Maven插件需要一个main方法可用,该方法被调用以初始化Spring应用程序上下文。不管您是否使用java-jar运行,您仍然需要初始化Spring框架。是什么让你说“没有自动配置的Tomcat服务器”-你是如何部署这个应用程序的?为了进一步解释我所说的“更轻松地开始应用程序”的意思,Spring Boot允许你创建可执行的WAR。这些是带有
public static void main
方法的WAR,以及WAR的MANIFEST.MF中指向该方法的一个条目。您为什么说“没有自动配置的Tomcat服务器”——我正在指定提供的Tomcat依赖项。也许我的问题的答案是您的建议,默认情况下会创建一个可执行的WAR,因此,可以创建一个主类required@daud我相信解释可能在我刚才强调的答案中,既没有自动配置的Tomcat服务器,也没有通过java-jar运行应用程序。为什么我们需要这个主类呢?Maven插件是为配合Spring Boot而设计的。Spring Boot假设存在一个
公共静态void main
方法,因为Spring Boot声明的部分意图是让应用程序更容易入门。因此,Maven插件需要一个main方法