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

art*_*emb 18 deployment tomcat tomcat6

文档说如果你有一个上下文文件:

$CATALINA_HOME/conf/Catalina/localhost/myapp.xml
Run Code Online (Sandbox Code Playgroud)

它不会被上下文文件替换:

mywebapp.war/META-INF/context.xml
Run Code Online (Sandbox Code Playgroud)

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

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

但是每当我重新部署战争时,它都会用/META-INF/context.xml替换这个myapp.xml!

它为什么这样做,我该如何避免呢?

感谢名单

小智 6

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

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

mvn tomcat:deploy-only -Dmaven.tomcat.update=true
Run Code Online (Sandbox Code Playgroud)

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

您也可以使用deploy-only参数模式来部署context.xml.

  • 对于在家里跟随的人:`mvn tomcat7:deploy-only -Dmaven.tomcat.update = true -Dmaven.tomcat.mode = both -Dmaven.tomcat.contextFile =/foo/context.xml`可以解决问题.伤心......但在tomcat7中有效. (2认同)

use*_*115 5

简短的回答:

只需将TOMCATHOME/conf/Catalina/localhost目录设置为只读,然后继续阅读以获取更多详细信息:

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

       chmod a-w TOMCATHOME/conf/Catalina/localhost
    
    Run Code Online (Sandbox Code Playgroud)

    瞧!别客气。

长答案

  • 由于历史原因,如果您碰巧多次定义相同的资源,Tomcat 允许您以非常特定的优先顺序在四个不同的位置(读取四个不同的文件)定义 Web 资源(JDBC 数据源等)。上面简短回答中提到的那些现在更适合每种用途,尽管您仍然可以使用其他的(不......您可能不想)。除非有人要求,否则我不会在这里讨论其他的。