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

时间:2010-10-27 11:35:49

标签: deployment tomcat tomcat6

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

$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!

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

感谢名单

6 个答案:

答案 0 :(得分:6)

取消部署重新部署的一部分会删除应用程序和关联的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 with parameter mode来部署context.xml。

答案 1 :(得分:3)

答案简短:

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

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

       chmod a-w TOMCATHOME/conf/Catalina/localhost
    

    瞧!欢迎您。

答案很长

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

答案 2 :(得分:0)

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

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

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

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

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

答案 3 :(得分:0)

根据文档(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 ="假"没有帮助。

其次:使目录只读,只会让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)

如果有人能说出这是什么"外部资源"这通常可以解决问题。

答案 4 :(得分:0)

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

取消部署会删除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

答案 5 :(得分:0)

标题Re-deploy from war without deleting context涵盖了标题所描述的一般性问题,目前仍是未解决的问题。

在不删除上下文的重新部署和在取消部署后删除上下文的取消部署之后进行部署之间存在公认的区别。该文档已过时,并且经理GUI仍然不支持重新部署。