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):
我们应用程序的最后一部分是 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/