如果我将war文件部署到Tomcat,例如 foo-bar-1.1.2.war ,我该如何部署它以便将其提取到 webapps / bar ,其网址为 / bar /... ?
我的目的是将war文件保存在webapps服务器及其版本信息中,以便我知道安装了哪个版本但是它会覆盖以前版本的应用程序。
我可以使用PSI Probe部署war文件。这将允许我为Web应用程序指定目标上下文。但是,这意味着我将丢失war文件名中的任何版本信息。
答案 0 :(得分:24)
Tomcat将始终将war文件的内容提取到同名的文件夹中(当它配置为部署战争时 - 默认等)。
您可以将其解压缩到您选择的文件夹名称。因此,如果您将foo.war
的内容手动解压缩到名为bar/
的文件夹,而不是仅仅将战争放入网络应用程序文件夹,它仍将加载Web应用程序。
但是,这是完全没必要的,因为您可以通过覆盖应用程序的上下文根元素来指定应用程序的URL模式而不会弄乱文件夹/ war文件名:
这通常是在Tomcat server.xml
中设置的 - 但这种做法相当普遍。相反,我建议您在Web应用程序/ war文件的META-INF文件夹中使用context.xml
:
<Context path="/bar" .../>
部署应用程序后,应将context.xml
复制到/conf/Catalina/localhost
,但重命名为foo.xml
请注意,如果您使用autoDeploy
或deployOnStartup
操作(来源http://tomcat.apache.org/tomcat-7.0-doc/config/context.html),则conext根必须是唯一的,还有一些其他注意事项。
其他选项包括:
foo-1.1.0
战争。foo/version1
您还可以使用Ant(或等效工具)自动部署(并执行上述任何操作)。
答案 1 :(得分:12)
有一点很重要,需要强调上下文片段定义的path
属性。引用documentation on the topic:
当主机执行autoDeploy或deployOnStartup操作时,Web应用程序的名称和上下文路径是从定义Web应用程序的文件的名称派生的。
deployOnStartup
是Tomcat主机的默认行为。
要遵循文档,这有一个非常重要的结果:
在
中定义上下文路径META-INF/context.xml
根据defining a Tomcat context的方式,这只能解决两个问题:
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
,这是生产环境中不鼓励的解决方案,因为它需要重新启动服务器另一种解决方案利用了unpackWARs
attribute。
在我看来,由于这些原因,在生产环境中实现细微路径的一般而简单的方法是利用naming战争文件(可能包括版本管理和解决方案)你的问题)。 war文件名中的单个尖锐(例如 test#path.war )意味着上下文路径中的一个段(例如 / test / path )。双锐引入版本号(例如 test #path ## 112.war )。无论是否解压缩war文件,热部署是否与部署无关(管理器或文件系统)并管理同一存档的多个版本,这都有效。
但是如果需要有一个与存档名称不同的路径,那么似乎唯一的解决方案是/conf/[enginename]/[hostname]/
目录或server.xml
文件中的描述符。对于这些,您需要访问服务器文件系统。
相关解决方案与Tomcat在日常生活中的配置和管理方式密切相关。
答案 2 :(得分:5)
如果您只想在war文件名中包含版本信息,可以将其命名为:my-app##1.2.3.war
。它被解压缩到目录my-app##1.2.3
,但上下文只是my-app
(即http://host/my-app/)。
至少与Tomcat 7.0.55一起使用