向tomcat部署战争

Posted

技术标签:

【中文标题】向tomcat部署战争【英文标题】:Deploy a war to tomcat 【发布时间】:2012-04-14 15:46:39 【问题描述】:

在过去 10 年左右的时间里,我有无数次机会将 Web 应用程序部署到 tomcat 中。我还编写了几个脚本试图自动执行此操作,但从未 设法使其完全自动化。

这就是问题所在。我正在尝试部署一个新的战争,与我的 tomcat 的 web 应用程序中的现有战争同名。

选项 1:天真的方法 - 只需复制战争并等待它更新分解的目录。这有时有效。很多时候 - 展开的目录没有在合理的时间内更新。 选项2:通过方法 - 停止tomcat,删除所有战争和临时文件。复制战争并启动tomcat。这通常涉及停止 tomcat,等待一段时间 - 然后检查进程是否还活着并杀死它。 选项 3:手动方法 - 这可能令人惊讶,但我发现它在很多时候都可以工作 - 复制战争,等待分解的目录更新,一旦完成 - 重启tomcat。如果没有 - 您可以尝试删除临时工作文件,这有时会有所帮助。

我还尝试了许多选项 - 使用不同的顺序和操作子集 - 重新启动、停止、删除战争、删除爆炸、删除本地主机上下文、删除本地主机工作目录、复制战争、睡眠、比较日期、礼貌地询问 tomcat重新加载等。似乎没有任何效果。

这可能是我做错了什么,但我从很多人那里听到了同样的经历,所以我在这里寻求一些建议 - 你说什么?向 tomcat 部署新战争的最佳方式是什么?

谢谢!

【问题讨论】:

有什么问题?停机时间?这是 DEV/PREPROD/whatever 还是 PROD?您是否需要在关机/重启周期中保持会话? 嘿@krakover 如果您对其中一个答案感到满意,您是否介意将其中一个标记为已接受 【参考方案1】:

您可以在 shell 脚本中使用 curl 轻松地自动执行此操作

在 tomcat 6 上:

curl --upload-file deployme.war "http://tomcat:s3cret@localhost:8088/manager/deploy?path=/deployme&update=true"

在tomcat 7上

curl -T "deployme.war" "http://tomcat:s3cret@localhost:8080/manager/text/deploy?path=/deployme&update=true"

或通过几乎任何编程语言。我发布了一个基于java的解决方案here

【讨论】:

【参考方案2】:

我倾向于选择选项 2。如果有一个我正在 ide 中工作的项目,尤其是附加了调试器的项目,我发现事情最终会开始变得一团糟。在我发现清除所有东西之前可能会追逐一个小时的红鲱鱼,问题就会消失。然后很高兴有一个脚本,我可以偶尔启动以清除所有内容:

强制关机,超时 60 秒 清除日志、临时、工作目录 清除 webapp 文件夹 从构建位置复制新的战争文件 分解新的war文件 如有必要,运行 awk 脚本以自定义属性文件中的机器特定值(因此之前展开) 使用 CATALINA_PID 环境变量集启动(以启用关机强制)

通常情况下会很好地关闭。如果没有,那么通常有一个后台线程已启动但缺少关闭挂钩(例如 memecached 客户端)并且需要追捕。通常,只是加入新的战争似乎是可行的。但是,如果在开发环境中,完全重启的脚本很好。

【讨论】:

+1 让脚本管理这一切,这是唯一可靠、可重复的方法 我已经让 tomcat 在启动时编写它的 pid,在关闭时删除它,所以我可以通过脚本判断它何时关闭而无需猜测。这是一种痛苦(我不记得该怎么做),但这是值得的。我的部署是 100% 自动化的。【参考方案3】:

Cargo - http://cargo.codehaus.org/ - 可用于将 WAR 文件远程部署到多个 Web 容器,包括 Tomcat。

请参阅http://cargo.codehaus.org/Quick+start 以获取 Java 示例。还提供 Ant 和 Maven 支持。

【讨论】:

Tomcat 还为 Ant 提供部署(和取消部署)任务。【参考方案4】:

我将 WAR 上传到我的主目录,cd 到 /usr/local/tomcat,然后运行以下命令:

bin/shutdown.sh
rm webapps/ROOT.war
rm -rf webapps/ROOT
cp ~/ROOT.war webapps
bin/startup.sh

很容易实现自动化,但到目前为止我一直太懒(或不够懒)来做这件事。

【讨论】:

【参考方案5】:

我只是使用 Tomcat 管理工具来停止进程,将其删除,然后安装新的 WAR。轻松愉快。

【讨论】:

【参考方案6】:

请参阅“使用客户端部署程序包进行部署”部分

它基本上是一个现成的 ant 脚本来执行常见的 tomcat 部署操作。

http://tomcat.apache.org/tomcat-7.0-doc/deployer-howto.html#Deploying_on_a_running_Tomcat_server

【讨论】:

我正在使用相同的方法。您知道是否可以添加“超时选项”?谢谢!

以上是关于向tomcat部署战争的主要内容,如果未能解决你的问题,请参考以下文章

无法使用部署到容器插件从 jenkins 部署对 Tomcat 的战争

无法在 Apache Tomcat 6 上部署战争

LifecycleException:无法在 Tomcat 中启动组件部署战争

Tomcat 上的战争部署需要很长时间

如何使用 maven 中的 tomcat 插件部署多个战争?

使用 Jenkins 将战争文件部署到 Tomcat 的推荐方法?