我正在Java Web应用程序中使用tomcat7-maven-plugin
。现在我可以使用命令mvn clean tomcat7:run
运行我的 Web 服务器。最近我注意到 https://tomcat.apache.org/maven-plugin-2.0/tomcat7-maven-plugin/plugin-info.html 还有一个名为tomcat7:run-war
的命令,它说:
tomcat7:run:
使用嵌入式 Tomcat 服务器将当前项目作为动态Web 应用程序运行。tomcat7:run-war:
使用嵌入式Tomcat服务器将当前项目作为打包的Web应用程序运行。
我知道命令tomcat7:run-war
会将我的应用程序打包到jar
或war
文件中,然后在嵌入式服务器中运行它。我的问题是,我们应该在什么情况下使用这个命令,tomcat7:run
还不够吗?或者,也许运行打包的应用程序将具有更高的性能?我不确定。提前谢谢。
简答
正在运行的应用程序和服务器性能是相等的。但是,您通常希望使用run-war
因为它为您提供了交付 war 文件的额外好处。如果绝对需要让应用程序尽可能快地在本地运行(几乎从未如此),则需要使用run
。
细节来了
让我们从什么是 war 文件以及它的创建目的开始:
战争。是打包 Web 应用程序的文件的扩展名 ZIP 格式的目录层次结构,是 Web 存档的缩写。爪哇岛 Web 应用程序通常打包为 WAR 文件以进行部署。 [贝尔东]
为什么 Java Web 应用程序被打包为WAR?
因为 WAR 不仅是一个 zip 文件,而且(正确构建)强制执行 Java Web 应用程序规范。您可以在任何容器上部署和运行 war 文件。查看维基百科以获得更多优势。
不同的目标,不同的结果
目标tomcat:run
和tomcat:run-war
都在嵌入式tomcat服务器上启动应用程序。tomcat:run-war
包括一个额外的package
目标,即将应用程序打包到 WAR 文件中。然后,这个WAR文件将被嵌入式tomcat服务器解压缩,以便能够运行该应用程序。所以应用程序和服务器是相同的,但结果对于run-war
是不同的,因为你得到了额外的 WAR 文件。
但是那个战争文件有什么用呢?
首先,除了多了几秒钟的构建时间外,它没有任何缺点。甚至热插拔工具和功能也可以与介于两者之间的 WAR 文件一起使用。 创建 WAR 文件作为该目标的一部分的主要原因是:
- 测试
- 多个部署
- CI 管道
- 归档
测试。构建 WAR 文件意味着您的构建管道将经历 WAR 构建的所有步骤。当您稍后将部署该 WAR 文件时(提醒:它是容器的标准),您可以测试"构建"、"解包"和"部署"步骤是否正常工作。此外,如果没有,您可以检查文件的结构。
多个部署。 您可以在本地生成并运行应用程序,但仍可以将该 WAR 文件部署到正在运行的多个容器中。在某些行业场景中,您需要确保 WAR 文件在不同的容器上运行,并且您可以使用该文件将其部署到任何地方。
CI 管道。 您可能不仅希望在本地使用应用程序,还希望将结果集成到持续集成中。也许您甚至可以自动将本地构建部署到测试服务器,但更有可能的是,您在 CI 服务器上有一个自动化过程,该过程构建 WAR,在某个测试或暂存系统上运行它,然后转发 WAR(如果工作正常)。
存档。 您可能希望保留所有过去的构建 WAR 文件。可能是出于提到的其他原因之一,或者只是作为快速历史访问的备份。了解磁盘空间和内存使用量如何随着应用程序的增长而演变也可能很有趣。存档 WAR 文件是调查这种情况的一种方法。它们也可能部署到 WAR 存档服务器。
<小时 />结论
这两个目标都有其用法,但通常最好使用run-war
目标,因为通过额外构建 WAR 文件可以获得好处。
免責聲明
由于这个话题有点过时了,我可能会补充以下内容:我只是在做一个历史性的回顾。对于每个单独的用例,今天的用例和需求可能有所不同。一些流程、专家目标和插件已经过时,或者出现了更好的实践。我只是在解释该目标制定时背后的可能意图。