Search code examples
maventomcattomcat7

Why not to use / as a context path in maven tomcat?


I'm using maven tomcat plugin to deploy an app. It does deploy in root context if I set path to <path>/<path> but I want to know if it causes any problems because the docs explicitly says "Do not use /".

Related question: How to set context path to root(“/”) in Tomcat 7.0 when using Maven

Why not to use / as path in maven tomcat?


Solution

  • The JavaDoc pointing out to "Do not use /" was introduced in this commit:

    (MTOMCAT-102) Add a mojo to build a standalone jar to run a web application: use path field to store webapp to have a more nice name than projet.build.finalName

    When scrolling down the commit you see that the path property value is used to create a JarArchiveEntry:

    os.putArchiveEntry( new JarArchiveEntry( path + ".war" ) );
    

    which for configured <path>/<path> would translate to a file name of "/.war" looking kind of invalid. On the other this would possibly yield to ".war" file name when extracted.

    Today for version 2.2 this piece of code looks like this changed for bug MTOMCAT-103:

    os.putArchiveEntry( 
        new JarArchiveEntry( 
            StringUtils.removeStart( path, "/" ) + ".war" 
        ) 
    );
    

    which for configured <path>/<path> would translate to ".war" as file name looking way more legal but still not really desirable imho.

    As the Tomcat 7 Documentation states the base file name for the empty context path (aka "/") should be ROOT your best bet is to choose <path>ROOT<path> to achieve the desired result.

    Edit:

    For reproducing this, I checked out tomcat-maven-plugin.git and used their integration test. I had some truble to get a functional build at all, bit after removing some stuff from their server.xml and changing tomcat7-maven-plugin version to 2.1 it worked:

    This is the diff applyied to their integration test app:

    diff --git a/tomcat7-maven-plugin/src/it/simple-war-exec-project/pom.xml b/tomcat7-maven-plugin/src/it/simple-war-exec-project/pom.xml
    index 8ce51b7..e00f0ea 100644
    --- a/tomcat7-maven-plugin/src/it/simple-war-exec-project/pom.xml
    +++ b/tomcat7-maven-plugin/src/it/simple-war-exec-project/pom.xml
    @@ -42,7 +42,7 @@
             <plugin>
               <groupId>org.apache.tomcat.maven</groupId>
               <artifactId>tomcat7-maven-plugin</artifactId>
    -          <version>@pom.version@</version>
    +          <version>2.1</version>
             </plugin>
           </plugins>
         </pluginManagement>
    @@ -65,7 +65,7 @@
                 </goals>
                 <phase>package</phase>
                 <configuration>
    -              <path>foo</path>
    +              <path>ROOT</path>
                   <serverXml>src/main/tomcatconf/server.xml</serverXml>
                 </configuration>
               </execution>
    diff --git a/tomcat7-maven-plugin/src/it/simple-war-exec-project/src/main/tomcatconf/server.xml b/tomcat7-maven-plugin/src/it/simple-war-exec-project/src/main/tomcatconf/server.xml
    index 76ab562..de086fc 100644
    --- a/tomcat7-maven-plugin/src/it/simple-war-exec-project/src/main/tomcatconf/server.xml
    +++ b/tomcat7-maven-plugin/src/it/simple-war-exec-project/src/main/tomcatconf/server.xml
    @@ -19,14 +19,7 @@
    
     <Server port="8010" shutdown="SHUTDOWN">
    
    -  <GlobalNamingResources>
    -    <!-- Used by Manager webapp -->
    -    <Resource name="UserDatabase" auth="Container"
    -              type="org.apache.catalina.UserDatabase"
    -       description="User database that can be updated and saved"
    -           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    -          pathname="conf/tomcat-users.xml" />
    -  </GlobalNamingResources>
    +  
    
       <Service name="Catalina">
         <Connector port="8080" keepAliveTimeout="1800000" maxKeepAliveRequests="30000" maxThreads="300" />
    @@ -34,8 +27,6 @@
         <Engine name="Catalina" defaultHost="localhost">
           <Valve className="org.apache.catalina.valves.AccessLogValve" 
                  resolveHosts="false" pattern="%t-ip:%a-protocol:%H-localPort:%p-path:%U-time:%D ms"/> 
    -      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    -             resourceName="UserDatabase" />
           <Host name="localhost" appBase="webapps" />
         </Engine>
    

    Then from within the folder /tomcat-maven-plugin/tomcat7-maven-plugin/src/it/simple-war-exec-project I did:

    $ mvn clean package
    ...
    [INFO] BUILD SUCCESS
    ...
    $ cd target/
    $ java -jar simple-war-exec-project-1.0-SNAPSHOT-war-exec.jar
    ...
    INFORMATION: Deploying web application archive C:\Temp\tomcat-maven-plugin\tomcat7-maven-plugin\src\it\simple-war-exec-project\target\.extract\webapps\ROOT.war
    ...
    

    And the result:

    enter image description here