gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:45:12 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com