Maven WAR依赖


82

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

非常感谢。

Answers:


115

自从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>

6
对我而言,唯一的问题是它不会
引入

1
是的,谢谢您的提示:)部分地为我工作。使用maven命令行,一切正常。在Eclipse中使用maven(m2e)时,建立战争中引用类的测试也是可以的,但是当我尝试运行测试(junit)时,我必须关闭m2e工作区分辨率才能正常工作。否则,junit运行将为战争的引用类抛出ClassNotFoundException。尽管war项目在项目的构建路径中的maven依赖库下列出,但不知何故,这些未包含在junit执行类路径中。任何的想法?
甘道夫

1
您可以将依赖项的pom添加为项目的依赖项,以获取可传递的依赖项。因此,您对班级和pom都有依赖性
Jonatan Cloutier

请注意,此插件应进入pom的<build>设置。
MichaelCleverly 2015年

就我而言,我需要src / main / resources / *,它们也包含在“ -classes.jar”中-太好了!
乔纳斯·柏林

24

实际上,通过设计,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类型来确定要包含在项目类路径中的工件的正确列表。

我会尝试的。)


1
Pascal,在我的项目中,我有单独的模块,用于在不同的服务器上运行集成测试(每个模块用于一台服务器)。这些测试模块具有测试类,并使用war和overlay的依赖关系。我的工作很棒。
cetnar

好吧,正如我写的那样,我不确定,因此感谢您的反馈,很高兴知道。您能否确定它可以与战争的传递依赖项一起使用,而不仅限于战争的Java类?
Pascal Thivent 09年

好,谢谢。我现在知道它是如何工作的(重要的部分是您的第二句话:您的测试项目也需要进行包装战争)。
Pascal Thivent 09年

1
我使用此插件的问题是m2eclipse不支持它:maven.40175.n5.nabble.com/…–
milan

该插件还会破坏Maven发行版和程序集插件,因为这两个插件都将尝试解析使用warpath插件的WAR的依赖关系,Maven会说无法解决type = warpath依赖关系。太糟糕了,它不起作用。
HDave 2010年

14

使用叠加层。首先,您的测试项目还需要包装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测试。


1
我在测试之前将其否决。我不知道这是否是因为我正在使用Maven3,但实际上我的/ classes和/ lib文件夹都通过多个WAR依赖关系被可传递地包括在内。再次-很抱歉投下反对票。显然,这是“正确”的答案。
HDave 2010年

4

好点,贾斯汀。那实际上让我解决了我的问题,即:将战争纳入装配之中,并包括其所有传递依赖项。我不能像您建议的那样将战争依赖项复制为“ jar”,因为程序集插件找不到该groupId / artefactId引用的jar,但是

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

作品!战争及其传递依存关系未包括在程序集中。要排除(现在也出现的)pom文件,我必须添加一个exclude元素,如下所示:

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

到我的assembly.xml文件中。

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


-1

如果您将战争项目的依赖项列为jar依赖项,那么它似乎会提取所需的jar /资源。我正在使用Maven 2.2 + m2eclipse。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.