有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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中那样执行