【问题标题】:Spring Boot application war in a standalone servlet container独立 servlet 容器中的 Spring Boot 应用程序大战
【发布时间】:2015-04-12 08:03:09
【问题描述】:

关于从 Spring Boot 应用程序构建战争并在独立 servlet 容器中运行它的一般问题。我的文档似乎与 Stack Overflow 上的示例不一致。

答案here 显示了几个月前我读到的这样做的方式。我读过这个here,但指南似乎已经改变,失去了实际的示例应用程序。

这里的“configure”方法引用主spring boot Application.class。

public class WebInitializer extends SpringBootServletInitializer {   

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

还有这些帖子herehere 显示了引用 SpringBootServletInitializer 子类本身的“配置”方法。

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

还有 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples 的 spring-boot-sample-traditional  示例应用程序,它显示“WAR 打包” 做的不一样

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

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

【问题讨论】:

    标签: spring maven spring-mvc spring-boot war


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的详尽解释 - 非常感谢 :)。我最终选择了“WebInitializer”方法,因为下面提到的 Spring Initializr 生成了......
    • @Andy Wilkinson,您说“如果您只想将应用程序部署到独立的 servlet 容器,那么您不需要 main 方法。” ...但是如何去做呢?所有关于 Spring 的文献似乎都是关于 Spring Boot,但没有人会将 Spring Boot 投入生产。在某个时间点,它们将部署到独立服务器,但几乎没有关于这样做的文献。有什么建议吗?
    • AFAIK,绝大多数人在生产环境中使用可执行 jar 而不是独立服务器运行 Spring Boot。如果您需要使用独立服务器,那么the documentation 和这个问题都会告诉您如何使用。
    【解决方案2】:

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

    选择您的项目类型(Gradle 或 Maven)和打包为战争。

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

    这将以“正确”的方式引导您的应用。

    【讨论】:

    • 谢谢 - 如果可以接受多个答案,也会接受这个作为答案......
    猜你喜欢
    • 2023-03-14
    • 2016-07-04
    • 1970-01-01
    • 2021-04-18
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多