Maven 战争依赖

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

非常感谢。

88725 次浏览

Use overlays. First, your test project need to have also packaging war.

Declare dependency of war project you want to test:

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>your-project-arftifactId</artifactId>
<version>${project.version}</version>
<type>war</type>
<scope>test</scope>
</dependency>

then configure 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>

In the above example in test project I overwrite webresources configuration files (like conxtext etc.).

EDIT: This solution wasn't tested with Maven 3.

Indeed, by design, Maven doesn't resolve transitive dependencies of a war declared as dependency of a project. There is actually an issue about that, MNG-1991, but it won't be solved in Maven 2.x and I'm not sure that I don't know if overlays allow to workaround this issue. My understanding of the suggested solution is to duplicate the dependencies, for example in a project of type pom.


(EDIT: After some more digging, I found something interesting in this thread that I'm quoting below:

I have been helping out with the development of the AppFuse project over the last month where we make heavy use of the war overlay feature in the Maven war plugin. It is a really nifty feature!

To get max power with war overlays I have developed the Warpath plugin that allows projects to use war artifacts as fully fledged dependencies. In brief:

1) The contents of the /WEB-INF/classes directory in the war dependency artifacts can be included in the project's classpath for normal compile, etc tasks.
2) Transitive dependencies from the war dependency artifacts become available for use by other plugins, e.g. compile and ear - so no more having to include all the dependencies when creating skinny wars!

The plugin has now been actively used in the AppFuse project for the last few months, and I feel it is at a point where it is both usable and stable. Would the war plugin team be interested in including the warpath functionality inside the war plugin? It would seem to be the most natural place to host it.

So, I don't have any experience with it, but the maven warpath plugin actually looks nice and simple and is available in the central repo. To use it,include the following plugin configuration element in your pom.xml file:

[...]
<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>
[...]

And add the war dependencies you want included in the classpath as warpath type dependencies:

[...]
<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>
[...]

Both the war and warpath dependency types are needed: the war type is used by the Maven war plugin to do the war overlay, the warpath type is used by the Warpath plugin to determine the correct list of artifacts for inclusion in the project classpath.

I'd give it a try.)

If you list the dependency on the war project as a jar dependency it seems to pickup the required jars/resources. I'm using Maven 2.2 + m2eclipse.

Good point, Justin. That got me actually solving my problem, namely: including a war into an assembly AND including all its transitive dependencies. I could not duplicate the war-dependency as 'jar' as you suggested since the assembly plugin would not find a jar referenced by that groupId/artefactId, but

  • duplicating the war-dependency as type pom

works! The war and its transitive dependencies are not included in the assembly. To exclude the (now also appearing) pom file I had to add an exclude element like this:

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

into my assembly.xml file.

I think this could also be a workaround for the original question of this thread.

There's another option since maven-war-plugin 2.1-alpha-2. In your WAR project:

<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>

This creates a classes artifact which you can use in the acceptance tests project with:

<dependency>
<groupId>your-group-id</groupId>
<artifactId>your-artifact-id</artifactId>
<version>your-version</version>
<classifier>classes</classifier>
</dependency>