84

我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已经设法使用 maven-dependency-plugin 解压 WAR,但是我无法让我的项目包含解压后的内容WEB-INF/lib/*.jarWEB-INF/classes/*包含在类路径中,因此构建失败。有没有办法将这些文件包含到类路径中,或者有没有更好的方法来依赖 WAR?

非常感谢。

4

5 回答 5

119

自 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>
于 2012-04-10T14:21:40.963 回答
25

实际上,按照设计,Maven 不会解决声明为项目依赖关系的战争的传递依赖关系。实际上有一个问题,MNG-1991,但它不会在 Maven 2.x 中得到解决,我不确定我不知道覆盖是否允许解决这个问题。我对建议的解决方案的理解是复制依赖项,例如在 pom 类型的项目中。


(编辑:经过更多挖掘,我在这个线程中发现了一些有趣的东西,我在下面引用:

上个月我一直在帮助开发 AppFuse 项目,我们在其中大量使用了 Maven 战争插件中的战争覆盖功能。这是一个非常漂亮的功能!

为了获得战争覆盖的最大功率,我开发了 Warpath 插件,它允许项目使用战争工件作为完全成熟的依赖项。简单来说:

1)war依赖工件中的/WEB-INF/classes目录的内容可以包含在项目的classpath中,用于正常的编译等任务。
2) 来自战争依赖工件的传递依赖可供其他插件使用,例如 compile 和 ear - 因此在创建瘦战争时不再需要包含所有依赖!

在过去的几个月里,该插件已经在 AppFuse 项目中得到了积极的使用,我觉得它已经到了既可用又稳定的地步。战争插件团队是否有兴趣在战争插件中包含战争路径功能?这似乎是举办它的最自然的地方。

所以,我对它没有任何经验,但是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 依赖类型都是需要的:war 类型被 Maven war 插件用来做 war 覆盖,warpath 类型被 Warpath 插件用来确定正确的工件列表以包含在项目类路径中。

我会试一试。)

于 2009-11-20T12:24:15.857 回答
15

使用叠加层。首先,您的测试项目还需要有包装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 配置文件(如上下文等)。

编辑:此解决方案未使用 Maven 3 进行测试。

于 2009-11-20T11:20:38.370 回答
4

好点子,贾斯汀。这让我真正解决了我的问题,即:将战争纳入程序集并包括其所有传递依赖项。我无法按照您的建议将战争依赖项复制为“jar”,因为程序集插件找不到该 groupId/artefactId 引用的 jar,但是

  • 将战争依赖复制为pom类型

作品!战争及其传递依赖项不包含在程序集中。要排除(现在也出现)pom 文件,我必须添加一个排除元素,如下所示:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

进入我的 assembly.xml 文件。

我认为这也可能是该线程原始问题的解决方法。

于 2011-04-22T16:18:44.747 回答
-1

如果您将 war 项目的依赖项列为 jar 依赖项,它似乎会拾取所需的 jars/resources。我正在使用 Maven 2.2 + m2eclipse。

于 2010-09-08T14:35:41.113 回答