代码之家  ›  专栏  ›  技术社区  ›  artemb

为什么tomcat会在重新部署时替换context.xml?

  •  18
  • artemb  · 技术社区  · 14 年前

    文档说明如果您在这里有一个上下文文件:

    $CATALINA_HOME/conf/Catalina/localhost/myapp.xml
    

    此处不会替换为上下文文件:

    mywebapp.war/META-INF/context.xml
    

    这里写着: http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

    只有在$CATALIANASBASE/CONF/[ EnEnEnEnE]/[HOSTNAME]中的应用程序中不存在上下文文件时,在应用程序文件内部的/META-IMF/CONExt.xml中的单个文件中。

    但每次我重新部署war时,它都会用/META-INF/context.xml替换myapp.xml!

    为什么要这样做,我如何才能避免?

    塔克斯

    5 回复  |  直到 14 年前
        1
  •  6
  •   Kosaro    7 年前

    redeploy的Undeploy部分删除app和关联的context.xml。

    如果使用maven tomcat plugin,如果使用以下命令部署应用程序,则可以避免删除context.xml:

    mvn tomcat:deploy-only -Dmaven.tomcat.update=true
    

    更多信息请点击此处: https://tomcat.apache.org/maven-plugin-2.0-beta-1/tomcat7-maven-plugin/deploy-only-mojo.html

    您也可以使用deploy only with parameter mode来部署context.xml。

        2
  •  3
  •   user4691115    10 年前

    简而言之:

    只要把 TOMCATHOME/conf/Catalina/localhost dir只读,并继续阅读以了解更多详细信息:

    • 为了 快速部署模式 (Eclipse动态web项目,direct Tomcat 在本地/非共享Tomcat服务器上,您只需定义JDBC数据源(或任何 其他“web资源”)使用 META-INF/context.xml文件 文件在 战争档案。在您的本地环境中简单快速,但不适用于staging、QA或 生产。
    • 为了 生成部署模式 (通常用于暂存、QA或prod),JDBC 数据源和其他“web资源”详细信息由 QA/生产团队,不再是开发团队。因此,他们 必须在Tomcat服务器中指定,而不是在WAR文件中指定 不再。在这种情况下,在文件中指定它们 TOMCATHOME/conf/Catalina/localhost/CONTEXT.xml (变更 卡特琳娜 通过引擎,和 本地服务器 主持人,以及 上下文 根据你的上下文)。然而, Tomcat将在每次部署时删除此文件。为了防止这种情况 删除,只需将此目录设为只读;在Linux中,您可以键入:

         chmod a-w TOMCATHOME/conf/Catalina/localhost
      

      喂!不客气。

    长话短说

    • 出于历史原因,Tomcat允许您在4个 如果您碰巧多次定义同一资源,则按非常特定的优先级顺序在不同的位置(读取四个不同的文件)。在 上面的简短回答现在更适合每一个目的,尽管你仍然可以 利用其他人(不。。。你可能不想。我不打算 在这里讨论其他的,除非有人要求。
        3
  •  0
  •   Michael Wyraz    12 年前

    在tomcat7上,woth autoDeploy=false文件将在取消部署时被删除。这是有文档记录的,不是一个bug(尽管它避免了服务器端固定配置的良好自动化部署)。

    我找到了一个解决问题的办法:

    • 在webapp中创建一个META-INF/context.xml文件,其中包含
    • 在服务器上,在Server.xml中创建第二个context“/config context”,并将所有服务器端配置参数放在那里
    • 在应用程序上,使用context.getContext(“/config context”).getInitParameter(…)访问那里的配置。

    这允许独立于部署的war的每主机配置。

    还可以通过添加“/config context MYPATH”等上下文来添加每个上下文配置。在应用程序中,您可以使用应用程序的上下文路径来计算配置应用程序的上下文路径。

        4
  •  0
  •   BTakacs    9 年前

    根据文件( http://tomcat.apache.org/tomcat-8.0-doc/config/automatic-deployment.html#Deleted_files )在重新部署时,tomcat会检测应用程序的删除(取消部署)。因此它将启动一个清理过程,同时删除目录和xml。这是独立的自动部署-所以它将发生在重新部署通过经理和修改战争。有3个例外:

    • 从未删除全局资源
    • 从不删除外部资源
    • 如果修改了WAR或DIR,则只删除XML文件 如果copyXML为true且deployXML为true

    我不知道为什么,但copyXML=“false”deployXML=“false”不会有帮助。

    第二:使目录只读只会使tomcat抛出异常而不会启动。

    您可以尝试将$CATALINA_BASE/conf/CATALINA/localhost/myapp-1.xml、$CATALINA_BASE/conf/CATALINA/localhost/myapp-2.xml等文件合并到$CATALINA_BASE/conf/context.xml中(只有在确保应用程序不会部署自己的上下文配置(如myapp-1.xml)时才有效)

    如果有人能说出“外部资源”是什么,通常就能解决问题。

        5
  •  0
  •   user250343    6 年前

    标题中描述的一般问题包括 Re-deploy from war without deleting context 目前这仍然是一个悬而未决的问题。

    在不删除上下文的重新部署和取消部署后删除上下文的重新部署之间存在公认的区别。文档已过期,管理器GUI仍然不支持重新部署。

        6
  •  -1
  •   Grim    6 年前

    重新部署包括两部分:取消部署和部署。

    取消部署将删除 conf/Catalina/yourhost/yourapp.xml 因为

     <Host name="localhost" appBase="webapps" unpackWARs="true" 
    
               autoDeploy="true">      <!-- means autoUndeploy too!!! -->
    
     </Host>
    

    更改 autoDeploy="false" Tomcat有 不再订货 移除 conf/Catalina/yourhost/yourapp.xml文件 .

    有一个特性允许我们将这些步骤(取消部署/部署)作为一个单独的步骤(重新部署)来执行,而不删除 context.xml . 此功能可通过管理器文本界面使用,但使用管理器html界面时此选项不可用。你可能要等到 bug in tomcat 是固定的。您可以使用此答案中描述的方法作为解决方法。

    推荐文章