【发布时间】:2009-02-24 11:33:15
【问题描述】:
我想收集一些关于将 Web 应用程序部署到正在运行的 Tomcat 的最佳实践。不久前,我不得不描述我们的 Web 应用程序的部署过程,这个过程看起来相当混乱。
假设,我们在 WAR 文件 (foo.war) 中正确配置了一个应用程序,并且不需要额外的配置。在这种情况下,部署过程相当简单:
- 将 foo.war 文件复制到 $CATALINA_HOME/webapps 目录。如果应用程序正确启动,应用程序将自动部署到 $CATALINA_HOME/webapps/foo 目录。
要取消部署应用程序:
- 从 $CATALINA_HOME/webapps 中删除 foo.war 文件。如果应用程序正确卸载,它将被卸载并删除 $CATALINA_HOME/webapps/foo。
现在我想在我正在运行的应用程序中覆盖一些上下文参数。阅读了docs,我需要做的就是:
- 创建一个名为 foo.xml 的 context.xml 文件
- 将文件复制到 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录。
很遗憾,这不起作用:应用程序不会重新启动。根据经验,我们发现唯一可行的解决方案是将war文件部署到$CATALINA_HOME/webapps之外的位置。 另外,WAR文件中可配置的上下文参数的默认值应该在web.xml中指定,因为WAR文件中的context.xml在外面有context.xml时是不会被读取的。
这是 foo.xml 的一个简单示例:
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="/path-to-deployment-directory/foo.war">
<Parameter name="myparam" value="newvalue" override="false"/>
</Context>
如果您希望“新值”覆盖 WAR 的 web.xml 中指定的值,请务必为参数指定 override=false。这对我们来说并不明显。
因此,要将应用程序部署到正在运行的 Tomcat:
- 创建一个名为 foo.xml 的 context.xml 文件
- 将文件复制到 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录。
- 将 foo.war 复制到 foo.xml 的 docBase 中指定的位置;应用程序将自动部署。
应用新的上下文参数:
- 将参数值添加到foo.xml并保存文件;应用程序将自动重新部署。
要取消部署应用程序:
- 从 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录中删除 foo.xml
请注意,删除 foo.war 也可以,但也会删除 foo.xml。
到目前为止,我有以下问题:
- 在不停止 tomcat 的情况下部署 Web 应用程序是否是最佳实践?我听说过一种观点,即永远不需要部署到正在运行的 tomcat,因为人们在单独的 tomcat 中运行每个应用程序。
- 将 WAR 文件复制到 $CATALINA_HOME/webapps 是否是个好主意,或者最好将它们保存在单独的位置?
- 如何配置部署到 $CATALINA_HOME/webapps 的应用程序
- 为什么 catalina.out 中没有用于部署应用程序的 INFO 行而有用于取消部署的行?是否可配置?
【问题讨论】:
标签: deployment configuration tomcat servlets