  ------
  Including A Third Party Library In application.xml
  ------
  Stephane Nicoll
  <snicoll@apache.org>
  ------
  2005-09-23

~~ 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/doxia/references/apt-format.html


Including A Third Party Library In application.xml

  If third party libraries need to be included in the generated application.xml, the
  'includeInApplicationXml' flag could be used. This flag works only for jar modules
  since they define third party libraries packaged within the EAR.

+--------
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>${project.version}</version>
        <configuration>
           [...]
           <modules>
             <jarModule>
               <groupId>artifactGroupId</groupId>
               <artifactId>artifactId</artifactId>
               <includeInApplicationXml>true</includeInApplicationXml>
             </jarModule>
          </modules>
        </configuration>
      </plugin>
    </plugins>
  </build>
+---------
