Is it possible to supply Tomcat6's context.xml file via the Maven Cargo plugin?

前端 未结 3 1548
野的像风
野的像风 2020-12-10 05:44

I\'d like to keep Tomcat\'s context.xml file out of my WAR file\'s META-INF directory if possible. Can this be done with Maven\'s cargo plugin? I can\'t seem to find the c

相关标签:
3条回答
  • 2020-12-10 06:13

    I haven't found a way to do this yet, but I have come up with a work around that works in my project. I currently have a project with essentially 3 submodules:

        dependencies
        webapp
        smoketest
    

    When I'm building the "webapp" project, I execute the following plugin declaration:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
            <execution>
            <id>create-war-smoketest</id>
            <phase>verify</phase>
            <goals>
                <goal>war</goal>
            </goals>
            <configuration>
                <webappDirectory>${project.build.directory}/exploded</webappDirectory>
                <primaryArtifact>false</primaryArtifact>
                <classifier>smoketest</classifier>
                <webResources>
                <resource>
                    <filtering>true</filtering>
                    <directory>src/test/resources/smoketest</directory>
                    <targetPath>META-INF</targetPath>
                    <includes>
                        <include>context.xml</include>
                    </includes>
                </resource>
                </webResources>
            </configuration>
            </execution>
        </executions>
    </plugin>
    

    And then when I'm running my Cargo/WebTest suite in the SmokeTest project, I specify the smoketest WAR file as a dependency and in my Cargo configuration set my deployrables thusly:

    <deployables>
        <deployable>
            <groupId>${pom.groupId}</groupId>
            <artifactId>webapp</artifactId>
            <type>war</type>
            <properties>
                <context>smoketest</context>
            </properties>
        </deployable>
    </deployables>
    

    With the dependency looking something like:

    <dependencies>
        <dependency>
            <groupId>${pom.groupId}</groupId>
            <artifactId>webapp</artifactId>
            <version>${pom.version}</version>
            <classifier>smoketest</classifier>
            <type>war</type>
            <scope>system</scope>
            <!-- trick the dependency plugin to never look for it in the repo -->
            <systemPath>${basedir}/../webapp/target/webapp-${pom.version}-smoketest.war</systemPath>
        </dependency>
    </dependencies>
    

    It's extremely dirty, but it at least works... for now. One quick note: my comment about forcing it to never look for a version in the repo is possibly incorrect at this point; I think this trick may have been broken by a change to the dependency plugin at some point.

    0 讨论(0)
  • 2020-12-10 06:18

    According https://tomcat.apache.org/tomcat-9.0-doc/config/context.html#Defining_a_context and https://tomcat.apache.org/tomcat-9.0-doc/config/context.html#Naming Tomcat 9 allows making individual application context.xml (checked).

            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.7.10</version>
                <configuration>
                    <container>
                        <containerId>tomcat9x</containerId>
                        <systemProperties>
                            <file.encoding>UTF-8</file.encoding>
                            <spring.profiles.active>tomcat,datajpa</spring.profiles.active>
                        </systemProperties>
                        <dependencies>
                            <dependency>
                                <groupId>org.postgresql</groupId>
                                <artifactId>postgresql</artifactId>
                            </dependency>
                        </dependencies>
                    </container>
                    <configuration>
                        <configfiles>
                            <configfile>
                                <file>src/main/resources/tomcat/context.xml</file>
                                <todir>conf/Catalina/localhost/</todir>
                                <tofile>${project.build.finalName}.xml</tofile>
                            </configfile>
                        </configfiles>
                    </configuration>
                    <deployables>
                        <deployable>
                            <groupId>ru.javawebinar</groupId>
                            <artifactId>topjava</artifactId>
                            <type>war</type>
                            <properties>
                                <context>${project.build.finalName}</context>
                            </properties>
                        </deployable>
                    </deployables>
                </configuration>
            </plugin>
        </plugins>
    
    0 讨论(0)
  • 2020-12-10 06:22

    Eureka! After many days of studying this problem I finally found a very effective solution. The key is to take your Tomcat XML context fragment file and use the <configfiles> element of cargo to drop it in the conf/Catalina/localhost directory with the name context.xml.default. The only downside is that this will make your context definitions available to all web-apps, but this shouldn't really matter only Cargo is using this Tomcat instance thus there is no other web-app.

    Here's the configuration:

    <configuration> <!-- Deployer configuration -->
        <type>standalone</type>
        <properties>
           <cargo.servlet.port>${tomcat6.port}</cargo.servlet.port>
        </properties>
        <deployables>
          <deployable>
            <groupId>com.myapp<groupId>
            <artifactId>myapp-war</artifactId>
            <type>war</type>
            <properties>
                   <context>${tomcat6.context}</context>
            </properties>
           </deployable>
         </deployables>
        <configfiles>
           <configfile>
             <file>${basedir}/../config/tomcat-context.xml</file>
             <todir>conf/Catalina/localhost/</todir>
             <tofile>context.xml.default</tofile>
           </configfile>
        </configfiles>
    </configuration>
    

    The net result is no more bogus WAR modules for testing only, and no more merging of WARs. Hope this helps somebody.

    0 讨论(0)
提交回复
热议问题