我正在编写一个验收测试项目,由于各种原因,这依赖于另一个打包为WAR的项目。我已经设法使用maven-dependency-plugin解压缩WAR,但我无法让我的项目包含要包含在类路径中的解包WEB-INF/lib/*.jar
和WEB-INF/classes/*
,因此构建失败。有没有办法将这些文件包含在类路径中,还是有更好的依赖WAR的方法?
非常感谢。
答案 0 :(得分:110)
自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>
答案 1 :(得分:23)
实际上,根据设计,Maven不会解决声明为项目依赖关系的战争的传递依赖关系。实际上有一个问题,MNG-1991,但它不会在Maven 2.x和中解决我不确定我不知道覆盖是否允许解决方法这个问题。我对建议的解决方案的理解是复制依赖关系,例如在类型为pom。
(编辑:经过一番挖掘,我在this thread找到了一些有趣的内容,我在下面引用:
我一直在帮助开发AppFuse项目 上个月我们大量使用战争叠加功能 Maven战争插件。这是一个非常漂亮的功能!
为了通过战争叠加获得最大功率,我开发了Warpath插件 这允许项目将war工件用作完全成熟的依赖项。 简而言之:
1)war依赖项中/ WEB-INF / classes目录的内容 工件可以包含在项目的类路径中以进行正常编译, 等任务。
2)来自战争依赖性工件的传递依赖性变为 可供其他插件使用,例如编译和耳朵 - 所以没有了 在创建瘦战时必须包含所有依赖项!该插件现已在AppFuse项目中积极使用 最近几个月,我觉得它已经到了可以使用的地步 稳定。 战争插件团队是否有兴趣包括战争路径 war插件里面的功能?这似乎是最多的 自然的地方来承办它。
所以,我对它没有任何经验,但maven warpath plugin实际上看起来很简单,并且可以在中央仓库中找到。要使用它,请在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>
[...]
并将您希望包含在类路径中的war依赖项添加为 warpath 类型依赖项:
[...]
<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类型来执行war覆盖,Warpath插件使用warpath类型来确定包含在项目中的正确工件列表类路径。
我试一试。)
答案 2 :(得分:13)
使用overlays。首先,您的测试项目还需要打包war
。
声明要测试的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 overlay:
<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进行测试。
答案 3 :(得分:4)
好的一点,贾斯汀。这让我真正解决了我的问题,即:将一场战争包括在一个装配中并包括其所有传递依赖。 我无法像你建议的那样将war-dependency复制为'jar',因为程序集插件找不到groupId / artefactId引用的jar,但是
作品! 战争及其传递依赖性不包括在集合中。 要排除(现在也出现)pom文件,我必须添加一个这样的exclude元素:
<excludes>
<exclude>*:pom</exclude>
</excludes>
进入我的assembly.xml文件。
我认为这也可能是该主题原始问题的解决方法。
答案 4 :(得分:-1)
如果将war项目的依赖项列为jar依赖项,则可能会获取所需的jar /资源。我正在使用Maven 2.2 + m2eclipse。