 ------
  Filtering Some Distribution Files
 ------
  Edwin Punzalan
 ------
  2006-07-26
 ------

~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you 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:
~~ https://maven.apache.org/doxia/references/apt-format.html


Filtering Some Distribution Files

* Introduction

  File filtering is used to substitute variable fields from inside a file to
  their represented values. For the Assembly Plugin, and most Maven filtering
  procedures, these variables are enclosed between $\{ and \}. For
  example, before a file is filtered, it contains <<<$\{project.artifactId\}>>>.
  But after filtering is complete, a new file is created with the project's
  <<<artifactId>>> substituting <<<$\{project.artifactId\}>>> and that this new
  file is used instead of the original one.

  Although filtering can be done during the process-resources phase, not all
  files going into your distribution will be coming from a project resource.
  Thus, the Assembly Plugin allows filtering of files before copying them into
  the created assembly.

  This example demonstrates how to filter files before adding them into the
  assembly. In this example, we need to filter distribution files into the
  archive. The files included in the distribution are:

    * README.txt

    * LICENSE.txt

    * NOTICE.txt

    []

  All the above files are in the root directory of the project but only the
  README and the NOTICE files should be filtered. The property file used to
  filter these are files is found in <<<src/assembly/filter.properties>>>.

  A property file is a file which contains the names of the variables and their
  corresponding string value. The format of its contents is identical to how Java
  Property files are saved. Below is an example of a property file:

+---
# lines beginning with the # sign are comments

variable1=value1
variable2=value2
+---


* The Assembly Descriptor

  Filtering is only enabled inside \<files\> so that's what we will use. Thus,
  our assembly descriptor will be:

+-----
<assembly xmlns="http://maven.apache.org/ASSEMBLY/${mdoVersion}"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/${mdoVersion} http://maven.apache.org/xsd/assembly-${mdoVersion}.xsd">
  <id>distribution</id>
  <formats>
    <format>jar</format>
  </formats>
  <files>
    <file>
      <source>README.txt</source>
      <outputDirectory></outputDirectory>
      <filtered>true</filtered>
    </file>
    <file>
      <source>LICENSE.txt</source>
      <outputDirectory></outputDirectory>
    </file>
    <file>
      <source>NOTICE.txt</source>
      <outputDirectory></outputDirectory>
      <filtered>true</filtered>
    </file>
  </files>
</assembly>
+-----

  The above descriptor tells the Assembly Plugin to filter both the README.txt
  and the NOTICE.txt files and to just copy the LICENSE.txt file.

  Alternatively, if there are many .txt files to include inside \<files\>, we can
  setup both \<fileSets\> and \<files\> like so:

+-----
<assembly xmlns="http://maven.apache.org/ASSEMBLY/${mdoVersion}"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/${mdoVersion} http://maven.apache.org/xsd/assembly-${mdoVersion}.xsd">
  <id>distribution</id>
  <formats>
    <format>jar</format>
  </formats>
  <fileSets>
    <fileSet>
      <directory>${basedir}</directory>
      <includes>
        <include>*.txt</include>
      </includes>
      <excludes>
        <exclude>README.txt</exclude>
        <exclude>NOTICE.txt</exclude>
      </excludes>
    </fileSet>
  </fileSets>
  <files>
    <file>
      <source>README.txt</source>
      <outputDirectory></outputDirectory>
      <filtered>true</filtered>
    </file>
    <file>
      <source>NOTICE.txt</source>
      <outputDirectory></outputDirectory>
      <filtered>true</filtered>
    </file>
  </files>
</assembly>
+-----

  The above descriptor adds all .txt files to the assembly but filters README.txt
  and NOTICE.txt files.


* The POM

  The configuration of the Assembly Plugin inside pom.xml should not be
  different from the others, except for the configuration of the filter file, so:

+-----
<project>
  [...]
  <build>
    [...]
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>${project.version}</version>
        <configuration>
          <filters>
            <filter>src/assembly/filter.properties</filter>
          </filters>
          <descriptors>
            <descriptor>src/assembly/distribution.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
   [...]
</project>
+-----

* Generating The Assembly

  To generate the distribution assembly, we then use:

+-----
mvn clean assembly:single
+-----
