如果可能的话,我想将Tomcat context.xml文件保留在WAR文件的META-INF目录之外。这可以用Maven货物插件完成吗?我似乎无法找到正确的配置。
答案 0 :(得分:13)
尤里卡!经过多天研究这个问题,我终于找到了一个非常有效的解决方案。关键是获取Tomcat XML上下文片段文件并使用货物的<configfiles>
元素将其放在conf/Catalina/localhost
目录中,名称为context.xml.default
。唯一的缺点是,这将使您的上下文定义可用于所有Web应用程序,但这并不重要,只有Cargo使用此Tomcat实例,因此没有其他Web应用程序。
以下是配置:
<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>
最终结果是不再需要伪造的WAR模块进行测试,也不再需要合并WAR。希望这有助于某人。
答案 1 :(得分:3)
根据https://tomcat.apache.org/tomcat-9.0-doc/config/context.html#Defining_a_context和https://tomcat.apache.org/tomcat-9.0-doc/config/context.html#Naming,Tomcat 9允许制作单个应用程序context.xml
(已选中)。
<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>
答案 2 :(得分:2)
我还没有找到办法做到这一点,但我已经想出了一个可以在我的项目中工作的方法。我目前有一个基本上有3个子模块的项目:
dependencies
webapp
smoketest
当我构建“webapp”项目时,我执行以下插件声明:
<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>
然后当我在SmokeTest项目中运行我的Cargo / WebTest套件时,我将smoketest WAR文件指定为依赖项,并在我的Cargo配置中设置了我的可部署程序:
<deployables>
<deployable>
<groupId>${pom.groupId}</groupId>
<artifactId>webapp</artifactId>
<type>war</type>
<properties>
<context>smoketest</context>
</properties>
</deployable>
</deployables>
依赖关系看起来像:
<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>
它非常脏,但它至少有效......现在。一个快速说明:我关于强制它永远不会在回购中寻找版本的评论在这一点上可能是不正确的;我认为这个技巧可能已经被某个时候对依赖插件的更改打破了。