apache-tomcat-9.0.0.M10:更改META-INF / context.xml中的Context-Path无法正常工作

时间:2016-09-20 08:42:52

标签: java xml tomcat

我有一个标准的Tomcat9安装。我只是在webapps文件夹中放了一个helloworld.war,在META-INF里面我把context.xml放在不同的路径上,如: <Context path="/newcontext" />

但上下文仍为http://localhost/helloworld而非http://localhost/newcontext

我尝试了很多东西,但是让Tomcat确信使用新路径是不可能的。谁能帮忙? 谢谢。

2 个答案:

答案 0 :(得分:2)

我发现Tomcat将忽略context.xml中定义的path属性。这在他们的文档(https://tomcat.apache.org/tomcat-9.0-doc/config/context.html)中没有明确说明,但这是我在我们构建的每个应用程序中不断观察的行为。

根据Tomcat docs:

  

在单个文件中(带有&#34; .xml和#34;扩展名)   $ CATALINA_BASE / conf / [enginename] / [hostname] /目录。 背景   路径和版本将从文件的基本名称(   文件名减去.xml扩展名)。此文件将始终采用   优先于Web应用程序中打包的任何context.xml文件   META-INF目录。

虽然这讨论了摆放在WAR之外的配置文件,但META-INF/context.xml

似乎也是如此。

这是文档为您的痛苦所暗示的内容:

  

如果要使用上下文路径部署WAR文件或目录   这与基本文件名无关,然后是以下之一   必须使用选项来防止双重部署:

     
      
  1. 禁用autoDeploy和deployOnStartup并在server.xml中定义所有上下文
  2.   
  3. 在Host的appBase之外找到WAR和/或目录,并使用带有docBase属性的context.xml文件来定义它。
  4.   
然而,他们继续劝阻选项1.

我个人发现最简单的解决方案是简单地为非根上下文和根上下文(/)恰当地命名WAR文件,以便根据Tomcat的约定简单地使用ROOT.war

答案 1 :(得分:0)

为了节省其他人使用META-INF / context.xml尝试部署到不同路径的时间和精力,并且对于Pavel's answer和其他人来说,似乎根本不可能(在tomcat 9.x)。

我希望通过配置war的META-INF / context.xml来部署到根上下文,但似乎它目前不可能(tomcat 9.x)。

使用host copyXML =“true”,使用war的基本名称部署context.xml(到tomcat的conf/Catalina/<host>)。由于路径配置规则,这在确定路径时占优势。也就是说,路径是根据.xml的基本名称命名的 - 因此是war的基本名称。正如所提及的文档和答案所述,上下文path字段不受的尊重,除非在server.xml中使用它。

这实际上是在文档中,但并不是显而易见的,你必须将它拼凑起来,特别是path属性随时可用。{/ p>

请参阅: Tomcat 9.0/ Config Guide/ Naming

  

当主机执行autoDeploy或deployOnStartup操作时,Web应用程序的名称和上下文路径派生自定义Web应用程序的文件的名称。因此,上下文路径可能未在应用程序中嵌入的META-INF / context.xml 中定义,并且上下文名称,上下文路径,上下文版本和基本文件名之间存在密切关系(文件名称减去任何.war或.xml扩展名)。

     

如果要使用与基本文件名无关的上下文路径部署WAR文件或目录,则必须使用以下选项之一来防止双重部署:   禁用autoDeploy和deployOnStartup并在server.xml中定义所有 Context   在Host的appBase之外找到WAR和/或目录,并使用带有docBase属性的context.xml文件来定义它。

Tomcat 9.0/ Config Guide/ Defining a Context

  
      
  • 可以明确定义单个Context元素:      
        
    • 在应用程序文件中的/META-INF/context.xml中的单个文件中。 (可选)(基于主机的copyXML属性)可以将其复制到$ CATALINA_BASE / conf / [enginename] / [hostname] /并将重命名为应用程序的基本文件名加上“.xml”扩展名。 / LI>   
  •   

Tomcat 9.0/ Config Guide/ Defining a Context/ Common Attributes/ path attribute

  

此属性必须仅在在server.xml中静态定义上下文时使用。在所有其他情况下,路径将从用于.xml上下文文件或docBase的文件名中推断出来。

在我看来,经过大量的游戏后,META-INF / context.xml的唯一用途是在部署时定义应用程序的其他配置项 - 例如resource configuration - 虽然我有兴趣了解其他人的想法。

请参阅Pavel's answer和其他人(下面)了解如何部署到不同的上下文路径和根上下文(不使用META-INF / context.xml - 此处没有自动部署(!)):