Spring 在独立的 servlet 容器中启动应用程序 war

Spring Boot application war in a standalone servlet container

关于从 spring 引导应用程序构建 war 并在独立的 servlet 容器中 运行 它的一般问题。我看到的文档似乎与 Stack Overflow 上的示例不一致。

答案here shows the way I read of doing this a couple of months ago. I read this here,但指南似乎已经改变,丢失了实际的示例应用程序。

这里的"configure"方法引用了main spring boot Application.class.

public class WebInitializer extends SpringBootServletInitializer {   

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
    }  
}

还有这些帖子 here and here 显示 "configure" 方法引用 SpringBootServletInitializer 子 class 本身。

public class BootStrap extends SpringBootServletInitializer {

   public static void main(String[] args) {
      SpringApplication.run(BootStrap.class, args);
   }

   @Override
   protected SpringApplicationBuilder configure(
          SpringApplicationBuilder application) {
      return application.sources(BootStrap.class);
   }   
}

还有一个main方法

spring-boot-sample-traditional 示例应用程序位于 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples,它显示 "WAR packaging" 做的不一样

 public class WebConfig extends WebMvcConfigurerAdapter {.........

我想知道在 spring 引导中选择这些看似实现相同目标的不同方式是否存在问题?还是它们都同样有效并且可以互换?

使用Spring Initializr http://start.spring.io/

选择您的项目类型(Gradle 或 Maven)并打包为 war。

添加 Web 作为依赖项并生成项目。

这将 bootstrap 您的应用采用 "correct" 方式。

让您的主应用程序 class 扩展 SpringBootServletInitializer(您问题中的 Bootstrap)或使用单独的 class(您问题中的 WebInitializer)是取决于个人口味。我的偏好是采用 Bootstrap 方法,但它们的工作方式相同;选择你喜欢的。

如果您只打算将应用程序部署到独立的 servlet 容器,那么您不需要 main 方法。如果您想 运行 应用程序作为可执行文件 war (java -jar my-app.war),或者您希望能够 运行 它直接在您的 IDE,即无需 IDE 将其部署到 servlet 容器。

spring-boot-sample-traditional 说明了 web.xml 到 Bootstrap 一个 Spring 启动应用程序的用法。一般来说,这不是推荐的方法,除非您被困在 Servlet 2.5 容器上。 WebMvcConfigurerAdapter的使用与WAR打包无关。查看其web.xml以查看相关配置。