为什么Spring Boot Maven插件需要主类来打包war?

时间:2018-12-14 09:20:06

标签: java spring spring-boot spring-boot-maven-plugin

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方法,但编译失败,提示该插件找不到主类。

1 个答案:

答案 0 :(得分:2)

在同一页面(11.3.3):

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#getting-started-first-application-main-method

我们应用程序的最后一部分是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中一样执行。