首页 文章

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

提问于
浏览
17

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

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

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

mywebapp.war/META-INF/context.xml

它写在这里: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!

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

感谢名单

5 回答

  • 0

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

    如果您使用maven tomcat插件,则可以避免在使用以下命令部署应用程序时删除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参数模式来部署context.xml .

  • 3

    The short answer:

    只需将 TOMCATHOME/conf/Catalina/localhost dir设为只读,并继续阅读以获取更多详细信息:

    • 对于本地/非共享Tomcat服务器上的 quick deployment mode (Eclipse动态Web项目,直接Tomcat连接等),您可以使用WAR文件中的 META-INF/context.xml 文件定义JDBC数据源(或任何其他'web resource') . 在您的本地环境中轻松快捷,但不适合登台,QA或 生产环境 .

    • 对于 build deployment mode (通常用于登台,QA或prod),JDBC数据源和其他'web resources'详细信息由QA / 生产环境 团队定义,而不是开发团队 . 因此,必须在Tomcat服务器中指定它们,而不是在WAR文件中指定它们 . 在这种情况下,请在文件 TOMCATHOME/conf/Catalina/localhost/CONTEXT.xml 中指定它们(由引擎更改 Catalina ,由主机更改 localhost ,并根据您的上下文更改 CONTEXT ) . 但是,Tomcat将在每个部署中删除此文件 . 要防止删除,只需将此目录设为只读;在Linux中你可以输入:

    chmod a-w TOMCATHOME / conf / Catalina / localhost

    瞧!别客气 .

    The long answer

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

    在tomcat7上,同样是autoDeploy = false,将在取消部署时删除该文件 . 这是记录而不是错误(虽然它避免了使用服务器端固定配置的良好自动部署) .

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

    • 在您的webapp中创建包含的META-INF / context.xml文件
      服务器上的

    • 在server.xml中创建第二个上下文"/config-context"并将所有服务器端配置参数放在那里

    • 在应用程序上使用context.getContext("/config-context").getInitParameter(...)来访问那里的配置 .

    这允许每个主机配置独立于已部署的战争 .

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

  • 6

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

    永远不会删除

    • 全局资源
      永远不会删除

    • 外部资源

    • 如果WAR或DIR已被修改,则仅当copyXML为true且deployXML为true时才删除XML文件

    我不知道为什么,但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)

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

  • 0

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

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

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

    更改 autoDeploy="false" ,Tomcat有 no order anymore 删除 conf/Catalina/yourhost/yourapp.xml .

相关问题