 ------
 Usage
 ------
 Jason van Zyl
 John Casey
 ------
 2011-01-20
 ------

~~ 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.

Usage

  To handle filtering this version of Maven Remote Resources Plugin uses
  {{{/shared/maven-filtering/index.html}Maven Filtering}} ${mavenFilteringVersion}.


* How to Create a Resource Bundle

 To turn on the bundle resource manifest generation you need to configure the plugin as follows:

-------------------
<project>
  ...  
  <build>
    <plugins>
      <!-- Turn this into a lifecycle -->
      <plugin>      
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>${project.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>bundle</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
------------------- 
 
 This will trigger the scanning of that project's <<<$\{basedir}/src/main/resources>>> directory and create the
 <<<$\{basedir}/target/classes/META-INF/maven/remote-resources.xml>>> {{{./remote-resources.html}manifest file}}.

 <<Note:>> The files have to be named like <<<*.vm>>> to mark them as {{{htps://velocity.apache.org}Velocity}} macro files which will
           be filtered by the <<process>> goal. If you don't name the files according to this,
           they will not been filtered.


* How to Use Remote Resource Bundles 

 To use remote resource bundles you need to configure the plugin as follows:

-------------------
<project>
  ...
  <build>
    <plugins>
      <!-- Turn this into a lifecycle -->
      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>${project.version}</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <resourceBundles>
                <resourceBundle>org.apache:apache-jar-resource-bundle:1.0</resourceBundle>
              </resourceBundles>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
-------------------

 This will retrieve the <<<apache-jar-resource-bundle-1.0.jar>>> from the remote repositories
 specified in your POM, process each resource in the bundle and deposit them in your projects
 <<<$\{basedir}/target/classes>>> directory. 


* Running Once in a Multi-Module Build

  <<Note:>> This feature was added in version 1.1.

  In many cases, an application build consists of multiple Maven modules, but you only need to
  include the license files, dependencies listing, etc. once for the entire application. Of course,
  in such cases, the dependencies listing needs to aggregate all dependencies of all modules.

  To accomplish this, you can use the <<<runOnlyAtExecutionRoot>>> parameter when you configure
  the Remote Resources Plugin in your application parent POM. This parameter limits execution of the
  Remote Resources Plugin to the root directory in which the build was run. In most cases, the
  application's distribution archives will be created at this top directory, so this is a natural
  location into which licensing and dependency information should be generated.

  To run the Remote Resources Plugin only in the execution root, use the following:

+---+
  <plugin>
    <artifactId>maven-remote-resources-plugin</artifactId>
    <version>${project.version}</version>
    [...]

    <executions>
      <execution>
        <id>process-remote-resources</id>
        <goals>
          <goal>process</goal>
        </goals>
        <configuration>
          <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
          [...]
        </configuration>
      </execution>
    </executions>
  </plugin>
+---+


* Specifying Delimiters for Filterable Expressions

  <<Note:>> This feature was added in version 1.1.

 By default, the Remote Resources Plugin supports expressions specified using either the '<<<$\{expr}>>>' or '<<<@expr@>>>' format.
 However, at times it may be more convenient to use a different set of filter delimiters. By configuring the 
 <<<filterDelimiters>>> and <<<useDefaultFilterDelimiters>>> parameters, you have a high degree of control over the 
 filtering process.
 
 To enable the filter delimiters for the format '<<<#\{expr}>>>' (Ruby-style), add the following to your plugin
 configuration:
 
+---+
      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>${project.version}</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <filterDelimiters>
                <filterDelimiter>#{*}</filterDelimiter>
              </filterDelimiters>
              [...]
            </configuration>
          </execution>
        </executions>
      </plugin>
+---+

  Notice the '<<<*>>>' character above. This denotes the dividing point between start and end delimiter, where the actual
  expression will be specified. 
  
  If your start and end delimiters are the same, you can use an even simpler configuration. For example, to enable filter
  delimiters for the format '<<<#expr#>>>', add the following to your plugin configuration:
  
+---+
      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>${project.version}</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <filterDelimiters>
                <filterDelimiter>#</filterDelimiter>
              </filterDelimiters>
              [...]
            </configuration>
          </execution>
        </executions>
      </plugin>
+---+

  When the filter processor executes and notices this delimiter specification missing a '<<<*>>>' character, it will simply
  assume the provided delimiter will be used as both the start <and> end delimiter for an expression.
  
  All of the above assumes that you still want the ability to use '<<<$\{expr}>>>' and '<<<@expr@>>>' delimiters. However, in
  cases where this would cause trouble, you can disable these default delimiters as follows:
  
+---+
      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>${project.version}</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <useDefaultFilterDelimiters>false</useDefaultFilterDelimiters>
              [...]
            </configuration>
          </execution>
        </executions>
      </plugin>
+---+
