Sharing Assembly Descriptors

So you have created an assembly descriptor that you feel is so good that you want to share it between several of your projects. The simplest way to solve this problem is to create a separate project for your assembly descriptor. Let's call the project my-assembly-descriptor.

Note: This example has been updated for version 2.2. The previous versions of this example were wrong. You must follow the steps below to make your shared assembly descriptors work with version 2.2 or later.

The Shared Assembly Descriptor Project

Here's what the directory structure for that project looks like:

my-assembly-descriptor
    +-- src
    |   `-- main
    |       `-- resources
    |           `-- assemblies
    |               `-- myassembly.xml
    `-- pom.xml

There are just two files in this project: your assembly descriptor myassembly.xml and a pom.xml.

Note: Your assembly descriptors must be in the directory /src/main/resources/assemblies to be available to the Assembly Plugin.

First let's check out the POM for the Shared Assembly Descriptor Project. It is quite simple:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>your.group.id</groupId>
  <artifactId>my-assembly-descriptor</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Shared Assembly Descriptor</name>
</project>

Next let's look at our shared assembly descriptor. This is just an example. Replace it with the assembly descriptor you want to share.

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
  <id>my-assembly-descriptor-id</id>
  <formats>
    <format>jar</format>
  </formats>
  <fileSets>
    <fileSet>
      <includes>
        <include>pom.xml</include>
      </includes>
      <useDefaultExcludes>true</useDefaultExcludes>
    </fileSet>
    <fileSet>
      <directory>src</directory>
      <useDefaultExcludes>true</useDefaultExcludes>
    </fileSet>
  </fileSets>
</assembly>

Run 'mvn install' on this project to install the Shared Assembly Descriptor project into your local repository.

The Project Using the Shared Assembly Descriptor

In the project that wants to use our Shared Assembly Descriptor, you need to add my-assembly-descriptor as a dependency on the Assembly Plugin. This makes our assembly descriptor available for the Assembly Plugin to use.

Note: You need to use the file name of your assembly descriptor, without the xml file extension, in <descriptorRef>. You can not use the id of your assembly descriptor. The assembly descriptor used in this example have the file name myassembly.xml, but its id is my-assembly-descriptor-id. Therefor we use myassembly to reference that assembly descriptor.

<project>
  <groupId>your.group.id</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modelVersion>4.0.0</modelVersion>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <dependencies>
          <dependency>
            <groupId>your.group.id</groupId>
            <artifactId>my-assembly-descriptor</artifactId>
            <version>1.0-SNAPSHOT</version>
          </dependency>
        </dependencies>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <!-- This is where we use our shared assembly descriptor -->
              <descriptorRefs>
                <descriptorRef>myassembly</descriptorRef>
              </descriptorRefs>
            </configuration>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>