在我的例子中,让我们考虑使用Spring Boot创建和配置的简单RESTful服务。该服务与数据库(例如Postgres)通信。
有什么区别:
.jar
文件并通过java -jar myservice.jar
在我的远程公共主机上运行它?或
.war
文件并将其部署在Tomcat / Jetty上?第一个选项似乎要容易得多,你只需要运行一个.jar
。在第二个选项中,您需要创建Tomcat实例,运行它然后部署.war
文件。
还有其他区别吗?这两种方法的优点和缺点是什么?
答案 0 :(得分:17)
将其打包到.war文件并将其部署在Tomcat / Jetty上?
如果可能的话,不要这样做。 原因:使用嵌入式tomcat(或任何其他服务器运行时,如下载,网络,码头等),构建微服务架构要容易得多。
正如Josh Long曾在他的一次春季IO会谈中所说的那样“make Jar, not War”
另一方面,如果你有一个带有servlet容器的现有基础设施,并且已经有多个application.wars在这些servlet容器中运行,你所要做的就是将你的应用程序打包为war文件和hand它是一个发布团队(或者说你只是被重用现有的基础设施),然后它就是一个不同的故事......但是,技术世界已经摆脱了这种做法。
同样,本着微服务的精神,本着春天启动的精神,我鼓励你使用嵌入式服务器并制作可运行的jar文件,而不是采用传统的部署。
如果您要将应用程序停靠,那么您有两个选项可以将tomcat打包到最终的工件中#34; (通过"最终的神器",我的意思是泊坞镜图像,而不是jar。罐子只是一个中间工件)。
OR
不过,任何一天,我都会选择第一个选项,因为这样可以让开发过程变得更加容易(而且不言而喻,加入新开发人员会更容易)。
答案 1 :(得分:1)
如product page所述,这些jar包含servlet容器,将直接启动它。
直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件)
如果你计划在一台主机上运行你的应用程序而没有其他东西(docker?),这可能是一个很好的可能性 - 如果你的主机包含其他应用程序,部署战争的方法会更有趣,因为你可以拥有这些servlet容器只在主机上一次。