我注意到很多项目(如DropWizard、Grails等)开始采用“fat” JAR 的概念(使用内嵌的Web服务器,如Jetty或Tomcat),而不是传统的WAR部署。这两种方法都涉及一个单独的JVM进程(即使部署了多个WAR到Tomcat,它们也属于同一个JVM进程)。
在什么情况下,哪种部署方法比另一种更可取?
我注意到很多项目(如DropWizard、Grails等)开始采用“fat” JAR 的概念(使用内嵌的Web服务器,如Jetty或Tomcat),而不是传统的WAR部署。这两种方法都涉及一个单独的JVM进程(即使部署了多个WAR到Tomcat,它们也属于同一个JVM进程)。
在什么情况下,哪种部署方法比另一种更可取?
以下是一些理由:
JAR的优点:
WAR或EAR的优点:
话虽如此,你总是可以提供2到3种类型的可执行文件以满足所有需求。任何构建工具都可以轻松做到这一点。
java -jar application.jar
即可运行。然而,可能有些用户想要控制使用哪个Web服务器,或者想要将多个应用程序部署到单个Web服务器中(例如为了避免端口冲突,特别是端口80和8080)。在这种情况下,“大” jar 文件可能会导致问题,或者至少会有一些不必要的代码,从而增加内存占用。我认为最好的方法是提供两个构件:一个“大” jar 文件,用于更容易地进行独立设置,以及一个仅包含应用程序的 war/ear 文件,供那些希望在自己的容器中部署应用程序的用户使用。我考虑用户的角度。你可以将这个自包含jar文件封装在.exe或.dmg中,并只需安装它,而无需了解如何部署的其他说明。此外,由于您仅为特定服务器执行部署,因此可以利用该特定服务器的优势。