  ---
  Configuration and Usage
  ---
  John Casey
  ---
  12-May-2006

~~ Copyright 2006 The Apache Software Foundation.
~~
~~ Licensed under the Apache License, Version 2.0 (the "License");
~~ you may not use this file except in compliance with the License.
~~ You may obtain a copy of the License at
~~
~~      http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~~ See the License for the specific language governing permissions and
~~ limitations under the License.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/guides/mini/guide-apt-format.html

Configuration and Usage

* Introduction

  This document is intended to provide instructions for using the
  maven-assembly-plugin. In order for this discussion to be useful, it's
  critical to cover two topics: configuration of the plugin - both inside the
  POM and, where possible, from the command line - and the different execution
  styles. For the sake of clarity, we'll cover configuration before execution.

* Configuring the Assembly Plugin

  Getting started with the Assembly Plugin is pretty simple. If you're using one
  of the prefabricated assembly descriptors, you just tell it which one; if
  you're using a custom assembly descriptor, you give it the path to the
  descriptor. Note that a single invocation of the Assembly Plugin can actually
  produce assemblies from multiple descriptors, allowing you maximum flexibility
  to customize the suite of binaries your project produces. When the assembly is
  created it will use the assemblyId as the artifact's classifier and will attach
  the created assembly to the project and will be uploaded into the repository
  on an install and deploy goal.
  
  
  For example, imagine that our project produces a jar. If we want to create an
  assembly binary that includes our project's dependencies, we can take
  advantage of one of the Assembly Plugin's prefabricated descriptors, as
  follows:
  
+---+
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <!-- NOTE: We don't need a groupId specification because the group is
             org.apache.maven.plugins ...which is assumed by default.
         -->
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        [...]
</project>
+---+

  Note that the Assembly Plugin allows you to specify multiple
  <<<descriptorRefs>>> at once, to produce multiple types of assemblies in a
  single invocation.
  
  Alternatively, we've created a custom assembly descriptor called
  <<<src.xml>>> in the <<<src/assembly>>> directory (see the
  {{{#Resources}Resources}} section for more information), we can tell the
  Assembly Plugin to use it instead:
  
+---+
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptors>
            <descriptor>src/assembly/src.xml</descriptor>
          </descriptors>
        </configuration>
        [...]
</project>
+---+

  Again, note that we could specify multiple custom assembly descriptors here.
  Additionally, it's possible to specify a mixture of <<<descriptors>>> and
  <<<descriptorRefs>>> within the same configuration.
  
  <<NOTE:>> Many other configuration options are available for the various mojos
  in the Assembly Plugin. For more information, see the
  {{{examples/index.html}examples section}} or the {{{plugin-info.html}plugin
  parameter documentation}}.
  
* Executing: Building an Assembly

  Once you've configured the various <<<descriptors>>> and <<<descriptorRefs>>>
  for the assemblies you want the project to produce, it's time to determine how
  you want to build them.
  
  Currently, there are two basic approaches to building assemblies: as a
  dedicated build action, or bound to a phase of the normal build lifecycle.
  Beyond this, it's also possible to have the Assembly Plugin simply create an
  assembly directory for any given <<<descriptor>>> or <<<descriptorRef>>>,
  instead of creating archives.
  
** Building an Assembly as a Standalone Process

  First, let's examine how we can build an assembly directly, as a process
  separate from the normal build lifecycle. In this case, assemblies won't be
  produced when the normal build is executed, only in special circumstances.

  <<NOTE:>> Invoking the <<<assembly>>> and <<<directory>>> mojos will cause
  Maven to build the project using the normal lifecycle, up to the <<<package>>>
  phase. Because many assemblies will contain compiled classes and other
  binaries, it's reasonable to assume that the package phase will be required to
  ensure those binaries exist and have been tested. The main advantage of
  producing an assembly in this way is to avoid producing it as part of your
  normal build process. In some cases, you may only want to create an assembly
  periodically; these mojos provide two ways to accomplish that goal.

*** Normal Assemblies

  You can build an assembly directly by executing:
  
+---+
mvn assembly:assembly
+---+

  When this build completes, you should see a file in the target directory with
  a name similar to the following:
  
+---+
target/sample-1.0-SNAPSHOT-jar-with-dependencies.jar
+---+

  Notice the artifact classifier, between the end of the version and the
  beginning of the file extension, <<<jar-with-dependencies>>>. This is the
  <<<id>>> of the assembly descriptor used to create this artifact.

*** Assembly Directories

  You can construct an assembly directory directly from the command line by
  executing:
  
+---+
mvn assembly:directory
+---+

  When completed, you should see a directory structure similar to this:
  
+---+
target
|-- sample-1.0-SNAPSHOT-jar-with-dependencies
|   |-- META-INF
|   |   |-- MANIFEST.MF
|   |   `-- maven
|   |       `-- org.sample
|   |           `-- sample
|   |               |-- pom.properties
|   |               `-- pom.xml
|   |-- junit
[...]
|   |       `-- TestRunner.class
|   |-- junit3.8.1
|   |-- org
|   |   `-- sample
|   |       `-- App.class
|   `-- stylesheet.css
+---+

** Building an Assembly as Part of the Build Lifecycle

  If you need to ensure that assemblies are produced whenever your project
  builds, or when a particular profile is activated (also useful for configuring
  other plugins during this special process), then the following two mojos are
  probably what you're looking for. The <<<attached>>> and
  <<<directory-inline>>> mojos are functional counterparts of the mojos
  discussed above, except that they are meant to bind into the default build
  lifecycle.
  
  The <<<assembly>>> mojo forces a <<<package>>> phase build to execute, in
  order to guarantee the availability of project binaries. Unfortunately, this
  currently means that binding the <<<assembly>>> mojo to the default lifecycle
  will cause Maven to execute the build twice - once for the main process, and
  once again in a forked lifecycle which is spawned by the <<<assembly>>> mojo
  itself.
  
  By contrast, the <<<attached>>> mojo assumes that the build has already
  produced project binaries or whatever else it needs prior to building the
  assembly itself. Because they depend on correct binding to the lifecycle in
  order to gain access to the files required by your project assembly, the
  <<<attached>>> and <<<directory-inline>>> mojos require the user to have much
  more intimate knowledge of the build process.

*** Normal Assemblies

  To bind the <<<attached>>> mojo to a project's build lifecycle, you can add
  this configuration (assuming you're using the <<<jar-with-dependencies>>>
  prefabricated descriptor):
  
+---+
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>packaging</phase> <!-- append to the packaging phase. -->
            <goals>
              <goal>attached</goal> <!-- goals == mojos -->
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
</project>
+---+

  Then, to create a project assembly, simple execute the normal <<<package>>>
  phase from the default lifecycle:
  
+---+
mvn package
+---+

  When this build completes, you should see a file in the target directory with
  a name similar to the following:
  
+---+
target/sample-1.0-SNAPSHOT-jar-with-dependencies.jar
+---+

  Notice the artifact classifier, between the end of the version and the
  beginning of the file extension, <<<jar-with-dependencies>>>. This is the
  <<<id>>> of the assembly descriptor used to create this artifact.

*** Assembly Directories

  If instead you want to bind the <<<directory-inline>>> mojo to a project's
  build lifecycle - so you can construct a directory containing your assembly -
  you can add this configuration (assuming you're using the
  <<<jar-with-dependencies>>> prefabricated descriptor):
  
+---+
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>packaging</phase> <!-- append to the packaging phase. -->
            <goals>
              <goal>directory-inline</goal> <!-- goals == mojos -->
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
</project>
+---+

  Then, to create a project assembly, simple execute the normal <<<package>>>
  phase from the default lifecycle:
  
+---+
mvn package
+---+

  When completed, you should see a directory structure similar to this:
  
+---+
target
|-- sample-1.0-SNAPSHOT-jar-with-dependencies
|   |-- META-INF
|   |   |-- MANIFEST.MF
|   |   `-- maven
|   |       `-- org.sample
|   |           `-- sample
|   |               |-- pom.properties
|   |               `-- pom.xml
|   |-- junit
[...]
|   |       `-- TestRunner.class
|   |-- junit3.8.1
|   |-- org
|   |   `-- sample
|   |       `-- App.class
|   `-- stylesheet.css
+---+

* Advanced Configuration

  As you've no doubt noticed, the Assembly Plugin can be a very useful way to
  create a self-contained binary artifact for your project, among many other
  things. However, once you've created this self-contained jar, you will
  probably want the ability to execute it using the <<<-jar>>> JVM switch.
  
  To accommodate this, the Assembly Plugin supports configuration of an
  <<<\<archive\>>>> element which is identical to that supported by the
  <<<maven-jar-plugin>>> (see {{{#Resources}Resources}}). Using this
  configuration, it's easy to configure the <<<Main-Class>>> attribute of the
  jar manifest:
  
+---+
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          [...]
          <archive>
            <manifest>
              <mainClass>org.sample.App</mainClass>
            </manifest>
          </archive>
        </configuration>
        [...]
      </plugin>
      [...]
</project>
+---+

  If we add this configuration to the <<<attached>>> mojo example above and
  rebuild, we will see an entry like this in the META-INF/MANIFEST.MF file of
  the resulting jar:
  
+---+
[...]
Main-Class: org.sample.App
+---+

  For more information on advanced configuration for the Assembly Plugin, see
  the {{{#Resources}Resources}} section.
  
** GOTCHA!

  At this point, the directory-oriented mojos - <<<directory>>> and
  <<<directory-inline>>> - <<do not>> support the <<<\<archive\>>>>
  configuration element.

* {Resources}

  [[1]] For more information on writing your own assembly descriptor, read the 
        {{{assembly.html}Assembly Descriptor}}
        
  [[2]] For more information about the <<<maven-jar-plugin>>>, look
        {{{http://maven.apache.org/plugins/maven-jar-plugin/}here}}.
        
  [[3]] For more information on advanced <<<maven-assembly-plugin>>>
        configuration, see the {{{examples/index.html}examples}}.
  
  []


