0

EDIT: This is a duplicate of apache-tomcat-9.0.0.M10: Change Context-Path in META-INF/context.xml not working. In the other question, it is stated that Tomcat ignores context.xml despite the docs and it also seems to be the case here.

I have a WAR copied to Tomcat 9 webapps. This WAR's /META-INF/context.xml is ignored, the resulting path is simply the WAR's name. I do not want it ignored. There is a lot of questions about that file being ignored, with answers "remove the context from Tomcat's conf/server.xml". But there is no such thing in conf/server.xml:

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

  </Host>

I have found the following docs:

Then, there is conf/context.xml:

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
</Context>

but I guess that it is obligatory.

This is the ignored /META-INF/context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/sc">
    <Manager pathname="" />
</Context>

I know that it is read by Tomcat, because introducing any syntax error into it makes Tomcat put the relevant error messages into its logs. Yet it is ignored anyways. I have found the following docs:

This "/META-INF/context.xml" file will be automatically copied to "$CATALINA_HOME/conf/[enginename]/[hostname]/", after being renamed to mirror the application's context path.

Once the "context.xml" file has been renamed and copied to the "[hostname]" directory, it will not be replaced, even if the WAR is updated with a new "/META-INF/context.xml" file.

which is confusing: what is the idea behind reading the WAR's context.xml just one time and then ignoring it? By the way, the directory conf/Catalina/localhost/ is empty anyways.

I tried to increase the log level to FINE, but I cannot make the logger report, how the context files are handled.

My question: if I have no context defined in conf/server.xml, how to make Tomcat not ignore /META-INF/context.xml in my WAR, including the cases where the context's contents change?

scriptfoo
  • 476
  • 5
  • 17

1 Answers1

1

You have asked several questions, here.

[Why is my path being ignored?]

(Technically you didn't ask this, but you clearly want to know why)

If you read the documentation, you'll see that Tomcat explicitly ignores the <Context> element's path attribute when it's bundled in a WAR file. There are a bunch of reasons for this including clarity and security.

What is the idea behind reading the WAR's context.xml just one time and then ignoring it?

Tomcat reads your application's META-INF/context.xml file on deployment. If you want it re-read, then redeploy your application (don't just just update/restart it). The file is read once and not overwritten to allow system administrators to override the contents if they disagree with developers/WAR-packagers over what should be configured.

How [do I] make Tomcat not ignore /META-INF/context.xml in my WAR, including the cases where the context's contents change?

You must redeploy the application. This may require an undeploy/deploy operation.

Christopher Schultz
  • 20,221
  • 9
  • 60
  • 77
  • Now I got the re-read part, but as of ignoring the WAR's `context.xml`, there is no respective message in the log, and it seems to me that Tomcat normally logs context ignoring (log level is FINE now). Additionally, anything which is mentioned in the link you have given was verified - no contexts in `conf/Catalina/` and neither in `conf/server.xml`. – scriptfoo Aug 03 '20 at 05:56