Spring 启动应用程序与部署在 Tomcat/Jetty 上的 war 文件
Spring boot app vs .war file deployed on Tomcat/Jetty
就我而言,让我们考虑使用 Spring Boot 创建和配置的简单 RESTful 服务。此服务与数据库(例如 Postgres)通信。
有什么区别:
- 通过
java -jar myservice.jar
? 在我的远程 public 主机上构建 Spring 引导 .jar
文件并 运行 它
或
- 将其打包到
.war
文件并部署到 Tomcat/Jetty?
第一个选项似乎更容易,你只需要运行一个.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 图片,不是罐子。罐子在这里只是一个中间工件)。
- 使用嵌入式 tomcat 以便 tomcat 将打包到您的 jar 中并使用 JVM docker 图像
或
- 从您的 jar 中排除 tomcat 并打包您的应用程序并使用 tomcat Docker 图像。
不过,任何一天,我都会选择第一个选项,因为这会使开发过程更容易(不用说,新开发人员的入职会更容易)。
就我而言,让我们考虑使用 Spring Boot 创建和配置的简单 RESTful 服务。此服务与数据库(例如 Postgres)通信。
有什么区别:
- 通过
java -jar myservice.jar
? 在我的远程 public 主机上构建 Spring 引导
.jar
文件并 运行 它
或
- 将其打包到
.war
文件并部署到 Tomcat/Jetty?
第一个选项似乎更容易,你只需要运行一个.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 图片,不是罐子。罐子在这里只是一个中间工件)。
- 使用嵌入式 tomcat 以便 tomcat 将打包到您的 jar 中并使用 JVM docker 图像
或
- 从您的 jar 中排除 tomcat 并打包您的应用程序并使用 tomcat Docker 图像。
不过,任何一天,我都会选择第一个选项,因为这会使开发过程更容易(不用说,新开发人员的入职会更容易)。