【问题标题】:Why does the spring boot maven plugin require a main class to package war?为什么spring boot maven插件需要一个主类来打包war?
【发布时间】:2018-12-14 09:20:05
【问题描述】:

Spring Boot 指南提供了创建可运行 jars 的代码,但我们也可以使用它来构建 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方法,编译失败说插件找不到主类。

【问题讨论】:

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


    【解决方案1】:

    从同一页面 (11.3.3):

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

    我们应用程序的最后一部分是 main 方法。这只是遵循应用程序入口点的 Java 约定的标准方法。我们的 main 方法通过调用 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() source 并且可以进行其自动配置和应用程序级别的 bean 连接等。只有当应用程序作为 war 文件部署在 servlet 容器中时才需要这种安排。 在 web 容器中当然不能得到“main 方法”就像在独立的分解应用程序或可执行 jar 或 war 中一样执行。

    【讨论】:

    • 既没有自动配置的Tomcat服务器,也没有通过java -jar运行应用程序。为什么我们需要那个主类?
    • Maven 插件旨在与 Spring Boot 一起工作。 Spring Boot 假定存在 public static void main 方法,因为 Spring Boot 的部分意图是让您的应用程序更容易上手。因此,Maven 插件需要一个可用的 main 方法,该方法被调用以初始化 Spring 应用程序上下文等。是否使用 java -jar 运行都没有关系,您仍然需要初始化 Spring 框架。是什么让你说“没有自动配置的 Tomcat 服务器”——你是如何部署这个应用程序的?
    • 为了进一步解释我所说的“更轻松地开始使用您的应用程序”的意思,Spring Boot 允许您创建可执行的 WAR。这些是带有 public static void main 方法的 WAR,以及 WAR 的 MANIFEST.MF 中指向该方法的条目。
    • 是什么让你说“没有自动配置的 Tomcat 服务器” - 我将 tomcat 依赖项指定为 provided。也许我的问题的答案是您建议默认创建一个可执行的 WAR,因此需要一个主类
    • @daud 我相信解释可能在我刚刚强调的答案部分中。
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2017-11-17
    • 2017-01-07
    • 2018-07-31
    相关资源
    最近更新 更多