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

Deployment 为什么tomcat在重新部署时替换context.xml?,deployment,tomcat,tomcat6,Deployment,Tomcat,Tomcat6,文档说明如果您在此处有上下文文件: $CATALINA_HOME/conf/Catalina/localhost/myapp.xml mywebapp.war/META-INF/context.xml 此处不会被上下文文件替换: $CATALINA_HOME/conf/Catalina/localhost/myapp.xml mywebapp.war/META-INF/context.xml 这里写着: 仅当$CATALINA_BASE/conf/[engineame]/[hostnam

文档说明如果您在此处有上下文文件:

$CATALINA_HOME/conf/Catalina/localhost/myapp.xml
mywebapp.war/META-INF/context.xml
此处不会被上下文文件替换:

$CATALINA_HOME/conf/Catalina/localhost/myapp.xml
mywebapp.war/META-INF/context.xml
这里写着:

仅当$CATALINA_BASE/conf/[engineame]/[hostname]/,在应用程序文件中的/META-INF/context.xml处的单个文件中不存在应用程序的上下文文件时

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

它为什么会这样做?我如何避免它


Thanx

重新部署的取消部署部分将删除应用程序和关联的context.xml

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

mvn tomcat:deploy-only -Dmaven.tomcat.update=true
更多信息请点击此处:


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

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

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

  • 在webapp中创建包含以下内容的META-INF/context.xml文件
  • 在服务器上,在Server.xml中创建第二个context“/config context”,并将所有服务器端配置参数放在那里
  • 在应用程序上,使用context.getContext(“/config context”).getInitParameter(…)访问其中的配置
这允许独立于已部署war的每主机配置


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

简短回答:

只需将TOMCATHOME/conf/Catalina/localhost目录设置为只读,并继续阅读以了解更多详细信息:

  • 对于快速部署模式(Eclipse动态web项目,直接使用Tomcat 在本地/非共享Tomcat服务器上,您只需定义JDBC数据源(或任何 其他“web资源”),使用 战争档案。在本地环境中轻松快速,但不适合登台、QA或 生产
  • 对于构建部署模式(通常用于暂存、QA或prod),JDBC 数据源和其他“web资源”详细信息由 QA/生产团队,不再是开发团队。因此, 必须在Tomcat服务器中指定,而不是在WAR文件中指定 不再在这种情况下,请在文件中指定它们 TOMCATHOME/conf/Catalina/localhost/CONTEXT.xml(更改Catalina 通过引擎,本地主机通过主机,上下文通过您的上下文)。然而, Tomcat将在每次部署时删除此文件。为了防止这种情况 删除,只需将此目录设置为只读;在Linux中,您可以键入:

    瞧!欢迎光临

长答案

  • 出于历史原因,Tomcat允许您用四种方式定义web资源(JDBC数据源等) 如果您碰巧多次定义同一资源,则按非常特定的优先顺序在不同的位置(读取四个不同的文件)。名单上的名字 以上简短的回答现在更适合于各种用途,尽管你仍然可以 使用其他的(不……你可能不想)。我不会去的 在这里讨论其他的,除非有人要求

根据文档()重新部署时,tomcat会检测到应用程序的删除(取消部署)。因此,它将启动一个清理过程,同时删除目录和xml。这是独立于自动部署的,所以它将在通过管理器重新部署和war修改后发生。有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)的情况下,这种方法才有效)


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

重新部署意味着两个部分:取消部署和部署

取消部署将删除
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
。此功能可通过manager文本界面使用,但使用manager html界面时该选项不可用。您可能必须等到问题解决后再做。您可以使用本答案中所述的方法作为解决方法。

标题中所述的一般问题包含在其中,目前仍然是一个悬而未决的问题


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

您是手动部署还是通过IDE插件部署?就个人而言,我不会在应用服务器上放置context.xml。我不知道,因为我很少能指望有机会