java - 为什么spring boot maven插件需要一个主类来打包war?

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

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

我尝试删除这个 main 方法,但编译失败,说插件找不到主类。

最佳答案

来自同一页面(11.3.3):

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

我们应用程序的最后一部分是 main 方法。这只是遵循 Java 应用程序入口点约定的标准方法。我们的 main 方法通过调用 run 委托(delegate)给 Spring Boot 的 SpringApplication 类。 SpringApplication 引导我们的应用程序,启动 Spring,而 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 子类并重写其配置方法。

...主类扩展了 SpringBootServletInitializer,而 SpringBootServletInitializer 又扩展了 WebApplicationInitializer。 WebApplicationInitializer 基于 servlet 3.0 ServletContainerInitializer 概念。 此扩展的目的是:WebApplicationInitializer 设置 servlet 上下文,并要求子类设置 SpringApplication 的源(使用 @SpringBootApplication 注释的类),以便它可以使用有效的调用 SpringApplication#run()仅当应用程序作为 war 文件部署在 servlet 容器中时才需要这种安排。 在 Web 容器中,“main 方法”当然无法获取像在独立的分解应用程序或可执行 jar 或 war 中一样执行。

关于java - 为什么spring boot maven插件需要一个主类来打包war?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776679/

相关文章:

java - 在为我们的应用程序形成 REST URL 时,我们应该如何区分与同一对象相关的两个服务?

java - 如何使用另一个 jar 文件启动和停止一个 jar 文件?

java - Spring Boot 中的外部 YAML 属性文件和普通属性文件

java - 在 spring-boot 中自动配置添加 PropertySource

java - 实现 Spring security Authentication 后,我的应用程序不返回正确的正文,仅返回空的 200 HTTP 响应

java - 按照 JPA 规范进行类型转换

java - 使用 Spring Integration 进行动态配置

java - Spring Boot 中的 SLF4J 冲突

java - 无法从 mapStruct Autowiring Mapper

java - Spring-boot - 两个相关字段的自定义验证