使用不同的路径将 war 文件部署到 Tomcat

2022-09-01 17:07:37

如果我将 war 文件部署到 Tomcat,例如 foo-bar-1.1.2.war,我该如何部署它,以便将其提取到 webapps/bar,其 URL 根目录为 /bar/...

我在这里的目的是将war文件及其版本信息保存在webapps服务器中,以便我知道安装了哪个版本,但将其覆盖以前版本的应用程序。

我可以使用PSI Probe部署战争文件。这将允许我为 Web 应用指定目标上下文。但是,这意味着我将丢失 war 文件名中的任何版本信息。


答案 1

Tomcat将始终将war文件的内容提取到同名的文件夹中(当它配置为部署wars时 - 作为默认值等)。

您可以将其解压缩为您选择的文件夹名称。因此,如果您将 的内容解压缩到手动调用的文件夹中,而不仅仅是将 war 拖放到 Web 应用程序文件夹中,它仍将加载 Web 应用程序。foo.warbar/

但是,这是完全不必要的,因为您可以通过覆盖应用程序的上下文根元素来指定应用程序的URL模式,而不会弄乱文件夹/war文件名:

这通常设置在Tomcat中 - 但这种做法被广泛阻止。相反,我建议您在Web应用程序/ war文件的META-INF文件夹中使用:server.xmlcontext.xml

<Context path="/bar" .../>

部署应用程序时,应将 复制到 ,但重命名为context.xml/conf/Catalina/localhostfoo.xml

请注意,conext 根目录必须是唯一的,如果您使用的是 or 操作(源 http://tomcat.apache.org/tomcat-7.0-doc/config/context.html),还需要考虑一些其他注意事项。autoDeploydeployOnStartup


其他选项包括:

  • 清理每个部署的 Web 应用文件夹,并加入新的战争。foo-1.1.0
  • 在平面文件中包括版本号。foo/version1
  • 或者简单地将版本包含在配置/ XML文件中。

您还可以使用 Ant(或等效工具)来自动执行部署(并执行上述任何一项)。


答案 2

关于上下文片段定义的属性,有一点需要强调。要引用有关该主题的文档,请执行以下操作path

当 Host 执行自动部署或 deployOnStartup 操作时,Web 应用程序的名称和上下文路径派生自定义 Web 应用程序的文件的名称。

deployOnStartup 是 Tomcat 主机的默认行为

要遵循文档,这有一个非常重要的后果:

上下文路径可能未META-INF/context.xml

根据定义Tomcat上下文的方法,这只能提供两种解决方案:

  • In individual files (with a ".xml" extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory
  • Inside a Host element in the main conf/server.xml,这是生产环境中不鼓励的解决方案,因为它需要重新启动服务器

另一种解决方案利用了解压缩 WAR 属性

在我看来,由于这些原因,在生产环境中实现微妙路径的一般而简单的方法是利用war文件的命名(可能包括版本管理并成为问题的解决方案)。war 文件名中的单个 sharp(例如 test#path.war)表示上下文路径中的一个段(例如 /test/path)。双锐化引入了版本号(例如 test#path##112.war)。无论解压缩 war 文件(热部署与否)是否与部署无关(管理器或文件系统),并且管理同一存档的多个版本,这都有效。

但是,如果需要有一个与存档名称不同的路径,似乎唯一的解决方案是目录或文件的描述符。对于这些,您需要访问服务器文件系统。/conf/[enginename]/[hostname]/server.xml

相关的解决方案与Tomcat在日常中的配置和管理方式高度相关。


推荐