Tomcat 未自动部署war文件

32
我按照以下步骤操作:
  • 关闭Tomcat
  • 使用时间戳为12月1日的war文件进行部署
  • 启动Tomcat——这将为已部署的war文件创建一个解压后的目录。
  • 停止Tomcat
  • 使用时间戳为12月3日的新war文件更新旧的war文件
  • 重新启动Tomcat
我发现当我重新启动Tomcat时,之前扩展的文件夹中的现有文件没有更新。难道不应该通过更新war文件来更新相关的jsp、class文件吗?
我查看了文档,并在此处找到了http://tomcat.apache.org/tomcat-5.5-doc/config/host.html,其中“Automatic Application Deployment”下的以下引用:

除了在启动时发生的自动部署外,您还可以请求在Tomcat运行时放置在appBase(或$CATALINA_HOME/conf/[engine_name]/[host_name]的情况下)目录中的新XML配置文件、WAR文件或子目录将根据上述规则自动部署。自动部署程序还将跟踪Web应用程序以下更改:

  • WEB-INF/web.xml文件的更新将触发Web应用程序的重新加载
  • 扩展的WAR文件的更新将触发卸载(删除已扩展的Web应用程序),然后进行部署
  • XML配置文件的更新将触发一个卸载(而不是删除任何已扩展的目录),然后进行相关Web应用程序的部署
难道不应该通过上述第二点自动更新文件吗?

在server.xml文件中设置了自动部署(Autodeploy)为true。

6个回答

33

历史上,至少对我来说,当您只是放入一个新的jar时,Tomcat从未更新 exploded 目录。 我一直认为这是一个错误,但从未深入研究过,因为有一个简单的解决方案。以下两种方法都可以正常工作:

  • 使用内置的 Manager 应用程序部署 war 文件。如果您愿意使用 GUI 进行生产管理,则很好。 请注意 如果您多次部署(再次说明,我从未深入探讨细节),则此工具以前存在问题,但 Tomcat 重新启动后可以正常工作。
  • 停止、删除和替换。停止 Tomcat,删除 exploded 目录,放入新的 war 文件。

  • +1 我也是。我采用了第二种解决方案,只需编写一个脚本即可完成。 - leonbloy
    我使用第二种方法,但没有删除已解压缩的目录。这就是不起作用的部分 :0 - ziggy
    8
    Tomcat解释道:“在应用程序基本目录(appBase)中,任何没有相同名称的目录(不带“.war”扩展名)的Web应用程序归档文件都将被自动展开,除非设置了unpackWARs属性为false。如果重新部署更新的WAR文件,请务必在重新启动Tomcat时删除已展开的目录,以便重新展开更新的WAR文件(请注意,如果启用了自动部署程序,则在移除先前展开的目录后,自动部署程序将自动展开更新的WAR文件)。" - David García González
    事实是,当您处于生产环境中时,重新启动应用程序服务器并不容易,特别是如果其他应用程序在该服务器实例下运行。 - stelios
    大家好,有人能告诉我这里的 Drop 是什么意思吗? - tash
    “Drop” 的意思是将文件复制到目录中。 - DwB

    8

    添加autoDeploy = true。这对我有用。

    <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    

    1
    看起来像一个 XML 元素。应该将它添加到哪个文件中? - AlikElzin-kilaka
    9
    在Tomcat的conf目录中编辑server.xml文件,就可以找到它了。 - Mircea Stanciu
    这些天Tomcat默认已经拥有它。 - Shtefan

    7

    我通常会将server.xml中的autodeploy设置为false。这样可以让我在不必处理相应目录的情况下,直接放置新的war包并重启tomcat。


    2

    我使用maven在ubuntu系统中的tomcat生成构建物,我有一个名为

    install_wars.sh

    的脚本,其内容如下:

    mvn clean install
    service tomcat7 stop
    find /var/lib/tomcat7/webapps/ -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} \;
    find . -name *.war -exec cp {} /var/lib/tomcat7/webapps/ \;
    service tomcat7 start
    

    您可能需要根据实际情况更改路径和Maven命令。

    Tomcat的停止/启动是为了避免应用程序在多次重新部署后变慢,因为可能会存在内存泄漏问题。


    2
    是的,需要更新 exploded 文件夹,但是您不需要停止 Tomcat 就可以完成这个工作 - 它可以在 Tomcat 运行时工作。您能否尝试在更新过程中不停止 Tomcat?
    另外,我使用内置的 Manager 应用程序,它允许我在域中的任何位置更新 war 文件而无需使用 root(或 apache 或其他运行 Tomcat 的用户)。这非常方便,并且可以集成到 Ant 脚本中。

    2
    我们在生产环境中没有安装管理或管理员应用程序,因此所有操作都通过脚本完成。我同意需要更新已拆分的文件夹。我想知道是否关闭了Tomcat导致了这个问题。 - ziggy

    1
    在我的情况下,我将artifact命名为

    ROOT.WAR
    

    但应为
    ROOT.war
    

    干杯!


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接