views:

488

answers:

4

I have two projects, my-lib and my-webapp. The first project is a dependency of my-webapp. Thus, when ask Maven2 to build my WAR, the my-lib JAR is added in the WEB-INF/lib/ directory of the web application.

However, I want to have the my-lib JAR unzipped directly in the WEB-INF/classes directory, exactly as if the my-lib sources were contained in the project my-webapp.

In others words, instead of having the following WAR content:

my-webapp/
  ...
  WEB-INF/
    lib/
      my-lib-1.0.jar
      ... (others third libraries)

I want to have that:

my-webapp/
  ...
  WEB-INF/
    classes/
      my-lib files
    lib/
      ... (others third libraries)

Is there a way to configure the my-webapp or the Maven2 war plugin to achieve that?

+1  A: 

The unpack mojo seems to be close to what you are aiming for. Not sure how to complete the entire flow you are proposing though.

(btw, I am doubtful if this a good idea. utility classes should go into jars, and the jars are put either in the WAR or io the EAR. Unpacking utility jars seems wrong)

blaufish
Concerning your comment: I only want to unpack *my* library, not the others ones. I want to do that because of the properties files, that may be modified. For the moment, these files are stored in the my-lib.JAR file, and if you want to modify one of the file, you need to unzip the JAR, modify the file and then repack the JAR...
romaintaz
Couldn't you just lay a patch into the classes directory when you modify a file?
Mike Cornell
Using this plugin, I've succeed to unpack the JAR in the WEB-INF/classes directory. However, I also have the my-lib.JAR in the WEB-INF/lib/ directory...
romaintaz
A: 

[Oops, just realized that you were using Maven. I don't delete this answer because it may come to the rescue of some Ant user. So there's no need to mod me down...]

How many times to I have to mention that Jar, War and Ear Ant tasks are subtasks of the Zip one? :-) If I remember correctly, something like this would do the trick:

<war dist="my-webapp.war">
    <zipgroupfileset dir="libs" includes="*.jar" prefix="WEB-INF/classes"/>
</war>

Also worth a trial is with src="mylib.jar" but I haven't tested this option.

Vladimir
A: 

As blaufish's answer says, you can use the maven-dependency-plugin's unpack mojo to unpack an artifact. However to avoid the jar appearing in WEB-INF/lib, you need to not specify it as a dependency, and instead configure the plugin to unpack specific artifacts.

The following configuration will unpack the contents of some.group.id:my-lib:1.0:jar into target/classes during the process-resources phase, even if the artifact is not defined as a dependency. Be careful when doing this though as there is potential to clobber your actual content, this can cause much debugging.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>unpack-my-lib</id>
      <phase>process-resources</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>some.group.id</groupId>
            <artifactId>my-lib</artifactId>
            <version>1.0</version>
            <type>jar</type>
            <overWrite>false</overWrite>
          </artifactItem>
        </artifactItems>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
        <overWriteReleases>false</overWriteReleases>
      </configuration>
    </execution>
  </executions>
</plugin>
Rich Seller