Maven WAR依赖

dee*_*o55 79 maven-2 war maven maven-dependency-plugin

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

非常感谢.

Chr*_*ter 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>
Run Code Online (Sandbox Code Playgroud)

这将创建一个类工件,您可以在验证测试项目中使用它:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 对我来说唯一的问题是它不会引入传递依赖 (5认同)

Pas*_*ent 23

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


(编辑:经过一些挖掘,我在这个帖子中找到了一些有趣的东西,我在下面引用:

在过去的一个月里,我一直在帮助开发AppFuse项目,我们在Maven war插件中大量使用了war叠加功能.这是一个非常漂亮的功能!

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

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

该插件现在已经在AppFuse项目中被积极使用了几个月,我觉得它正处于可用和稳定的程度.war插件团队是否有兴趣在war插件中包含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>
[...]
Run Code Online (Sandbox Code Playgroud)

并将您希望包含在类路径中的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>
[...]
Run Code Online (Sandbox Code Playgroud)

war和warpath依赖类型都是必需的:Maven war插件使用war类型来进行war覆盖,Warpath插件使用warpath类型来确定包含在项目类路径中的正确的工件列表.

我试一试.)


cet*_*nar 14

使用叠加层.首先,您的测试项目还需要包装war.

声明要测试的war项目的依赖关系:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后配置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>
Run Code Online (Sandbox Code Playgroud)

在上面的测试项目示例中,我覆盖了webresources配置文件(如conxtext等).

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