Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

maven-assembly plugin - how to create nested assemblies

Tags:

maven-2

I have a project whereby I'm trying to create a distribution zip file, which contains (amongst other files) an executable jar with dependencies of my java project.

So I sort of want it to look like this:

-wiki-search-1.0.0-dist.zip     -wiki-search.bat     -wiki-search-help.html     -wiki-search-1.0.0-jar-with-dependencies.jar         -jar content... 

I'm using the assembly plugin, and the predefined descriptor "jar-with-dependencies" to create my executable jar file.

I'm specifying a separate assembly plugin entry in my pom, referencing a custom descriptor to try and build the distributable zip file.

So the part of my pom looks like this:

<plugin>  <artifactId>maven-assembly-plugin</artifactId>  <configuration>   <descriptorRefs>    <descriptorRef>jar-with-dependencies</descriptorRef>   </descriptorRefs>   <archive>    <manifest>     <mainClass>quicksearch.QuickSearchApp</mainClass>    </manifest>   </archive>  </configuration>  <executions>   <execution>    <id>make-assembly</id>    <phase>package</phase>    <goals>     <goal>attached</goal>    </goals>   </execution>  </executions> </plugin> <plugin>  <artifactId>maven-assembly-plugin</artifactId>  <configuration>   <descriptors>    <descriptor>src/main/assembly/dist.xml</descriptor>   </descriptors>  </configuration>  <executions>   <execution>    <id>make-assembly</id>    <phase>package</phase>    <goals>     <goal>attached</goal>    </goals>   </execution>  </executions> </plugin> 

And my custom descriptor looks like this:

<assembly>   <id>dist</id>   <formats>     <format>tar.gz</format>     <format>tar.bz2</format>     <format>zip</format>   </formats>   <fileSets>     <fileSet>       <includes>         <include>${project.basedir}/target/wiki-search-0.0.1-SNAPSHOT-jar-with-dependencies.jar</include>       </includes>       <outputDirectory>.</outputDirectory>      </fileSet>     <fileSet>       <directory>${project.basedir}/src/main/etc</directory>       <includes>         <include>*</include>       </includes>      <outputDirectory></outputDirectory>      </fileSet>   </fileSets> </assembly> 

Everything works fine. The jar-with-dependencies is being built. My dist zip file is being built. But the dist zip file does not contain the jar-with-dependencies file.

like image 848
Ben Avatar asked Oct 05 '09 22:10

Ben


1 Answers

With your existing configuration, your two separate configurations for the assembly plugin will be merged, and the configurations will also be merged.

To achieve your goal you should define a single assembly-plugin configuration with multiple nested executions, then define the configuration for each execution inside it. The assembly plugin will then execute each assembly sequentially, so the jar-with-dependencies jar will be available for inclusion in the dist jar. Also note the attached goal is deprecated in favour of the single goal.

Also note that paths in the assembly are relative to the root, and to include a particular file you should use the <files> element rather than the <filesets> element. You can also specify properties in the assembly to make it less fragile to change.

The rearranged configuration and assembly below should do what you're after:

Assembly descriptor:

<assembly>   <id>dist</id>   <formats>     <format>tar.gz</format>     <format>tar.bz2</format>     <format>zip</format>   </formats>   <files>     <file>       <source>         target/${project.artifactId}-${project.version}-jar-with-dependencies.jar       </source>       <outputDirectory>/</outputDirectory>     </file>   </files>   <fileSets>     <fileSet>       <directory>${project.basedir}/src/main/resources</directory>       <includes>         <include>*</include>       </includes>      <outputDirectory>/</outputDirectory>      </fileSet>   </fileSets> </assembly> 

Assembly plugin:

<plugin>  <artifactId>maven-assembly-plugin</artifactId>  <executions>   <execution>    <id>jar-with-dependencies</id>    <phase>package</phase>    <goals>     <goal>single</goal>    </goals>    <configuration>     <descriptorRefs>      <descriptorRef>jar-with-dependencies</descriptorRef>     </descriptorRefs>     <archive>      <manifest>       <mainClass>quicksearch.QuickSearchApp</mainClass>      </manifest>     </archive>    </configuration>   </execution>   <execution>    <id>dist</id>    <phase>package</phase>    <goals>     <goal>single</goal>    </goals>    <configuration>     <descriptors>      <descriptor>src/main/assembly/dist.xml</descriptor>     </descriptors>    </configuration>   </execution>  </executions> </plugin> 
like image 74
Rich Seller Avatar answered Sep 22 '22 05:09

Rich Seller