Maven WAR依赖

时间:2009-11-20 10:25:20

标签: maven maven-2 war maven-dependency-plugin

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

非常感谢。

5 个答案:

答案 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

作品! 战争及其传递依赖性不包括在集合中。 要排除(现在也出现)pom文件,我必须添加一个这样的exclude元素:

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

进入我的assembly.xml文件。

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

答案 4 :(得分:-1)

如果将war项目的依赖项列为jar依赖项,则可能会获取所需的jar /资源。我正在使用Maven 2.2 + m2eclipse。