  ---
  Including Module Binaries
  ---
  John Casey
  ---
  05-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
                                                                                                                        
Including Module Binaries

* Introduction

  It is common practice to create an assembly using the parent POM of a
  multimodule build. At times, you may want to ensure that this assembly also
  includes one or more of the module binaries.
  
  This example demonstrates how to include the artifact and dependencies of a 
  module, under the directory <<<modules/\<module-name\>>>>.
  
* The Assembly Descriptor

  First, let's write an assembly descriptor to create this assembly. For the
  sake of clarity, this descriptor will be as simple as possible, only
  demonstrating the features described by this example.
  
+---+
<assembly>
  <id>bin</id>
  <formats>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <includes>
        <include>org.test:child1</include>
      </includes>
      <binaries>
        <outputDirectory>modules/${artifactId}</outputDirectory>
        <includeDependencies>true</includeDependencies>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>
+---+

  This descriptor states that the assembly id should be <<<bin>>>, that the
  output format is a directory, and that the contents of the assembly should
  <<not>> be contained within a directory named after the finalName of the 
  top-level project.
  
  Furthermore, it states that we wish to include the artifact files for the module
  with a groupId of <<<org.test>>> and an artifactId of <<<child1>>>, along with
  its dependency artifacts. These artifacts should be contained within the 
  directory structure <<<modules/child1>>> for this module, since the 
  outputDirectory expression will be interpolated on a module-by-module basis.
  
* The POM

  Now, let's review the POM configuration necessary to enable the building of
  this assembly via the <assembly:directory> mojo:
  
+---+
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.test</groupId>
  <artifactId>parent</artifactId>
  <version>1.0</version>
  
  <packaging>pom</packaging>
  
  <name>Parent</name>

  <modules>
    <module>child1</module>
    <module>child2</module>
    <module>child3</module>
  </modules>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptors>
            <descriptor>src/assemble/bin.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
+---+

  This POM simply directs the Assembly Plugin to use the <<<bin.xml>>>
  assembly descriptor when executing.
  
* Execute!

  To build the assembly, we issue the following command:
  
+---+
mvn clean package assembly:directory
+---+

  This will ensure that the output directory (normally, <<<target>>>), is
  removed before building the assembly directory. 
  
  <<NOTE:>> Because of a quirk in Maven 2.0's execution model relating to 
  aggregator mojos and the inheritance hierarchy, we need to explicitly execute 
  the package phase ahead of the assembly invocation, to ensure all modules have 
  been built.
  
* Examining the Output

  When the Maven execution completes, the following directory structure should
  be left:
  
+---+
target/parent-1.0-bin
`-- modules
    `-- child1
        |-- child1-1.0.jar
        `-- junit-3.8.1.jar
+---+

