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