Spring 启动应用程序与部署在 Tomcat/Jetty 上的 war 文件

Spring boot app vs .war file deployed on Tomcat/Jetty

就我而言,让我们考虑使用 Spring Boot 创建和配置的简单 RESTful 服务。此服务与数据库(例如 Postgres)通信。

有什么区别:

第一个选项似乎更容易,你只需要运行一个.jar。在第二个选项中,您需要创建 Tomcat 实例,运行 它然后部署一个 .war 文件。 还有其他区别吗?这两种方法的优缺点?

product page 中所述,这些 jar 包含 servlet 容器并将直接启动它。

Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)

如果您计划 运行 您的应用程序在一台主机上没有其他任何东西(docker?)这可能是一个不错的可能性 - 如果您的主机包含其他应用程序部署方法战争会更有趣,因为您可以在主机上只拥有一次这些 servlet 容器。

Package it to .war file and deploy it on Tomcat/Jetty?

尽可能不要这样做。 原因:使用嵌入式 tomcat(或任何其他服务器运行时,如 undertow、netty、jetty 等),构建微服务架构要容易得多。

正如 Josh Long 在他的一次 Spring IO 演讲中所说的那样 “make Jar, not War”

另一方面,如果您有一个现有的带有 servlet 容器的基础架构,并且这些 servlet 容器中已经有多个 application.wars 运行,那么您所要做的就是打包您的应用程序作为 war 文件并将其移交给发布团队(或者更确切地说,您被迫只重用现有的基础架构),然后这是一个不同的故事......但是,技术世界已经远离这种做法。

同样,本着微服务的精神,本着 spring 引导的目的,我鼓励您使用嵌入式服务器并制作可运行的 jar 文件,而不是使用传统部署。

编辑

如果您正在 docker 调整您的应用程序,您有 2 个选项可以将 tomcat 打包到 "final artifact" 中("final artifact",我的意思是 docker 图片,不是罐子。罐子在这里只是一个中间工件)。

  1. 使用嵌入式 tomcat 以便 tomcat 将打包到您的 jar 中并使用 JVM docker 图像

  1. 从您的 jar 中排除 tomcat 并打包您的应用程序并使用 tomcat Docker 图像。

不过,任何一天,我都会选择第一个选项,因为这会使开发过程更容易(不用说,新开发人员的入职会更容易)。