【问题标题】:Deploy a war to tomcat向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 如果您对其中一个答案感到满意,您是否介意将其中一个标记为已接受

标签: java tomcat deployment


【解决方案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

        【讨论】:

        • 我正在使用相同的方法。您知道是否可以添加“超时选项”?谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 2013-11-27
        • 2017-07-23
        • 2018-06-28
        相关资源
        最近更新 更多