【问题标题】:frequent updates of a Tomcat applicationTomcat 应用程序的频繁更新
【发布时间】:2012-03-18 15:33:07
【问题描述】:

我有一个在 Windows 机器上的 Tomcat 7 服务器上运行的应用程序。在当前阶段,我必须经常更新和修复它。每当我需要更新应用程序时,我都会这样做:

  1. 在我的 Linux 开发计算机上构建一个新的 war 文件(使用 ant);
  2. 进入Windows服务器,停止Tomcat服务;
  3. 将文件从我的电脑下载到Windows电脑,放在webapps下;
  4. 移除 webapps 下的旧应用文件夹;
  5. 删除 work/Catalina/localhost 下的旧应用程序文件夹(否则会保留旧版本的缓存)。
  6. 重新启动 Tomcat 服务。

我确信有一种方法可以自动完成所有这些操作。这是什么?

【问题讨论】:

  • 查看这个 ANT build.xml stackoverflow.com/a/18460429/185565 答案。它展示了如何在开发时直接从项目文件夹中使用 webapp。立即查看 .jsp、.js、.css 更改要容易得多。稍后建立战争以部署到某个地方。部署可以使用 ant filecopy 或 ssh/ftp 将 .war 复制到 tomcat/webapps/ 文件夹。

标签: web-applications deployment build-automation tomcat7


【解决方案1】:

使用kwatee agile deployment(我是开发人员),您可以在短短几分钟内将webapps 自动部署到tomcat(请参阅tutorial)。然后,您可以通过简单的 Web 界面按需触发部署,或者使用 kwatee ant 任务或 kwatee maven 插件自动触发部署。哦,它也是免费的。

【讨论】:

  • 那是一个很棒的软件,谢谢!但是,我没有找到一种方法来实现我的确切用例: * Windows 服务器处于脱机状态 - 我没有 ftp/telnet/ssh 访问权限。 * 我手动将战争下载到 Windows 服务器。 * war 文件总是具有相同的名称,因此如果我知道如何构建这样的脚本,服务器端脚本可能会自动部署它。
  • 您可以使用 kwatee 生成 CLI 离线安装程序。将安装程序复制到 Windows 框后,只需启动它,它就会执行所有必要的操作。您只需修改教程的配置,将 curl 替换为 curl.exe,您可以从 curl.haxx.se 下载。
【解决方案2】:

总结:我会花一些时间来建立构建和部署方案。这是一个前期工作,但是一个通用的解决方案可以在设置后根据需要进行扩展。

您可以使用 Ant 脚本完成第 1 步。您首先要安装 Ant,然后编写一个简短的 build.xml 以包含类似 this example 的内容。正确安装 Ant 后,您只需切换到 build.xml 所在的目录并运行“ant”即可。

对于第 2 步到第 6 步,由于您需要清理目标、管理服务等,我会考虑生成 MSI 安装程序或可执行文件。我首选的 MSI 工具是Advanced Installer。您将在the list of features 下看到免费软件版本允许您在安装和卸载时控制(启动、停止、安装、卸载)Windows 服务。

(旁注:我们已经使用 Advanced Installer Enterprise 四年了。它在不断改进,是一款非常优质的产品。您不会失望的。)

您也可以通过 Ant 控制 MSI 创建。这是我的 build.xml 中的一个片段,它调用了几个宏来编译和部署我维护的一个产品:

<target name="myproduct-installer" depends="unzip-myproductdocs">
    <build-ai-installer product.name="MyProduct" installer.path="setup/installs/MyProduct" project.file="MyProduct.aip" />
</target>
<target name="release-myproduct-installer">
    <release-AI-installer product.name="MyProduct" installer.path="setup/installs/MyProduct" product.path="${some-predefined-target}" />
</target>

以下是上面使用的宏:

<macrodef name="build-ai-installer">
    <attribute name="product.name" />
    <attribute name="installer.path" />
    <attribute name="project.file" />
    <sequential>
        <echo message="Making installer at @{installer.path}" />
        <mkdir dir="@{installer.path}/newInstall" />
        <exec dir="@{installer.path}" executable="${env.ADVANCEDINSTALLER}" failonerror="true">
            <arg line="/edit @{project.file} /SetVersion ${product.version}" />
        </exec>
        <exec dir="@{installer.path}" executable="${env.ADVANCEDINSTALLER}" failonerror="true">
            <arg line="/build @{project.file}" />
        </exec>
    </sequential>
</macrodef>

<macrodef name="release-AI-installer">
    <attribute name="product.name" />
    <attribute name="installer.path" />
    <attribute name="product.path" />
    <sequential>
        <copy todir="@{product.path}">
            <fileset dir="@{installer.path}/newInstall" />
        </copy>
    </sequential>
</macrodef>

这些宏使用名为 env.ADVANCEDINSTALLER 的 Windows 环境变量。更简单的构建设置只需设置 Ant 属性并删除“env”。前缀:

<property name="ADVANCEDINSTALLER" value="path-to-AdvancedInstaller.com" />

这种级别的自动化一旦启动并运行,就会带来回报。但如果超出您的需要(我不会感到惊讶),this answer 可能会有所帮助。

【讨论】:

【解决方案3】:

有办法做到这一点。

一种方法是使用持续集成系统,例如Jenkins。它可以让您定期或在每次提交到源存储库后构建战争。

然后是 Jenkins Deploy Plugin,可用于在构建后将战争部署到正在运行的 Tomcat 实例。它使用 Tomcat 的标准管理器 webapp,因此必须在 Tomcat 中安装它,并设置用户和密码。

请注意,不幸的是,频繁地重新部署到正在运行的 Tomcat 是一种发现 web 应用程序在取消部署时泄漏内存的简单方法。 OutOfMemoryMemoryLeakProtection Tomcat wiki 上的文章是有用的读物​​。自动重启 Tomcat 可能是一种有用的权宜之计。

【讨论】:

  • 好的,我安装了 Jenkins 和部署插件,创建了一个空的构建作业并选中了“部署”复选框,运行该作业,但什么也没发生 - 控制台输出显示“成功”但新的战争未部署...
  • @Erel 空构建是什么意思?如果这项工作没有引发一场战争,你是如何告诉它从哪里获取部署的?您是否填写了部署操作的所有设置(包括 tomcat 地址/用户名/密码)?控制台没说别的吗?
  • 我终于明白我必须有一些构建步骤才能使插件工作。但是,还有另一个问题 - 部署插件似乎只是将战争放入 webapps 文件夹,而没有停止 Tomcat 服务。这会导致同样的问题,就像我做同样的事情一样:stackoverflow.com/questions/9896102/…
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多