我正在编写一个用于验收测试的项目,由于各种原因,这取决于打包为WAR的另一个项目。我已经设法使用maven-dependency-plugin解包了WAR,但是我无法使我的项目包含解包的内容WEB-INF/lib/*.jar
并WEB-INF/classes/*
包含在类路径中,因此构建失败。有没有办法将这些文件包含到类路径中,还是有更好的方法依赖于WAR?
非常感谢。
Answers:
自从maven-war-plugin 2.1-alpha-2以来,还有另一个选择。在您的WAR项目中:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
这将创建一个类工件,您可以将其用于验收测试项目中:
<dependency>
<groupId>your-group-id</groupId>
<artifactId>your-artifact-id</artifactId>
<version>your-version</version>
<classifier>classes</classifier>
</dependency>
实际上,通过设计,Maven不会解决宣告为项目依赖的战争的传递依赖。实际上存在一个有关MNG-1991的问题,但是它不会在Maven 2.x中得到解决,而且我不确定我不知道覆盖层是否可以解决此问题。我对建议的解决方案的理解是复制依赖关系,例如在pom类型的项目中。
(编辑:经过更多的挖掘,我在下面引用的该线程中找到了一些有趣的东西:
在过去的一个月中,我一直在协助AppFuse项目的开发,在此我们大量使用了Maven war插件中的war overlay功能。这是一个非常漂亮的功能!
为了最大程度地利用战争叠加,我开发了Warpath插件,该插件使项目可以将战争伪像用作成熟的依赖项。简单来说:
1)战争依赖工件中/ WEB-INF / classes目录的内容可以包含在项目的类路径中,以进行常规编译等任务。
2)来自战争依赖工件的传递性依赖变得可以由其他插件使用,例如编译和耳朵-因此,在创建骨瘦如柴的战争时,无需再包含所有依赖!在过去的几个月中,该插件现已在AppFuse项目中得到了积极使用,我认为它处于实用和稳定的地步。战争插件小组是否有兴趣在战争插件中包含warpath功能?这似乎是举办它的最自然的地方。
因此,我没有任何经验,但是maven warpath插件实际上看起来很简单,并且可以在中央仓库中使用。要使用它,请在pom.xml
文件中包含以下插件配置元素:
[...]
<build>
<plugins>
<plugin>
<groupId>org.appfuse</groupId>
<artifactId>maven-warpath-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>add-classes</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
并添加要包含在类路径中的战争依赖项作为战争路径类型依赖项:
[...]
<dependencies>
<dependency>
<groupId>org.appfuse</groupId>
<artifactId>appfuse-web</artifactId>
<version>2.0</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.appfuse</groupId>
<artifactId>appfuse-web</artifactId>
<version>2.0</version>
<type>warpath</type>
</dependency>
</dependencies>
[...]
war和warpath依赖类型都是必需的:Maven war插件使用war类型进行战争叠加,Warpath插件使用warpath类型来确定要包含在项目类路径中的工件的正确列表。
我会尝试的。)
使用叠加层。首先,您的测试项目还需要包装war
。
声明要测试的战争项目的依存关系:
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>your-project-arftifactId</artifactId>
<version>${project.version}</version>
<type>war</type>
<scope>test</scope>
</dependency>
然后配置Maven-war-plugin覆盖:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>${basedir}/src/main/webresources</directory>
<filtering>true</filtering>
</resource>
</webResources>
<overlays>
<overlay/>
<overlay>
<groupId>your.group</groupId>
<artifactId>your-project-artifactId</artifactId>
</overlay>
</overlays>
</configuration>
</plugin>
在测试项目的上述示例中,我覆盖了webresources配置文件(例如conxtext等)。
编辑:此解决方案未经Maven 3测试。