tags:

views:

2941

answers:

3

Hi There, I am writing a project for accepatance testing and for various reasons this is dependent or another project which is packaged as a WAR. I have managed to unpack the WAR using the maven-dependency-plugin, but I cannot get my project to include the unpacked WEB-INF/lib/.jar and WEB-INF/classes/ to be included on the class path so the build fails. Is there a way to include these files into the class path, or is there a better way of referencing a WAR file.

Many thanks.

A: 

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.).

cetnar
Not exactly sure how this works...I get a compilation error before it packages my files as a WAR....
deelo55
+3  A: 

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.)

Pascal Thivent
Pascal, in my project I have separate modules for running integration test on different servers (each module for one server). These test modules have test classes and use dependency of war and overlays. I works great.
cetnar
Well, as I wrote, I was not sure, so thanks for that feedback, it's good to know. Can you just confirm it works with the transitive dependencies of a war and not only the java classes of the war?
Pascal Thivent
Yes it works. All libraries from WEB-INF\lib are copied.
cetnar
Ok, thanks. I see how it works now (the important part is your 2nd sentence: *your test project need to have also packaging war*).
Pascal Thivent
The problem I have with this plugin is that it's not supported by m2eclipse: http://maven.40175.n5.nabble.com/Dependency-with-war-type-td136645.html
milan
A: 

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.

Justin