<!--
  ~ 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.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" />
<meta http-equiv="content-type" content="" />
<title>Maven2 AAR Plug-in Guide</title>
<link href="../../../css/axis-docs.css" rel="stylesheet" type=
"text/css" media="all" />
</head>
<body>
<h1>Maven2 AAR Plug-in Guide</h1>
<h2>Introduction</h2>
<p>This plugin generates an Axis 2 service file (AAR file).</p>
<p><a href="http://ws.apache.org/axis2/tools/index.html" target=
"_blank">[Download Plugin Tool]</a></p>
<h2>Goals</h2>
<p>The AAR plugin allows the packaging of an Axis 2 service aar in
3 different modes:</p>
<ol>
<li><b>axis2-aar:aar</b>: generates the aar artifact</li>
<li><b>axis2-aar:inplace</b> : package the aar in the source tree</li>
<li><b>axis2-aar:exploded</b> : package an exploded aar application</li>
</ol>
<p>Each mode is materialized by a goal. For instance, to generate
an exploded aar from the current project, one would type</p>
<pre>
mvn axis2-aar:exploded
</pre>
<h2>Configuration</h2>
<p>All AAR plugin goals takes the following configuration
parameters as input:</p>
<table border="2">
<tbody>
<tr>
<td><strong>Parameter Name</strong></td>
<td><strong>Default Value</strong></td>
<td><strong>Description</strong></td>
</tr>
<tr>
<td>aarDirectory</td>
<td>${project.build.directory}/aar</td>
<td>Directory where the aar file is built</td>
</tr>
<tr>
<td>classesDirectory</td>
<td>${project.build.outputDirectory}</td>
<td>Directory with compiled classes and resources</td>
</tr>
<tr>
<td>fileSets</td>
<td></td>
<td>Additional file sets, which are being added to the archive. See
"<a href="#file_sets">File Sets</a>" below for an example</td>
</tr>
<tr>
<td>servicesXmlFile</td>
<td></td>
<td>Location of the services.xml file. By default, it is assumed
that the file is already present in classesDirectory/META-INF and
no special processing is required</td>
</tr>
<tr>
<td>wsdlFile</td>
<td></td>
<td>Location of the WSDL file. By default, it is assumed that the
file is already present in classesDirectory/META-INF and no special
processing is required</td>
</tr>
<tr>
<td>wsdlFileName</td>
<td>service.wsdl</td>
<td>Name, to which the WSDL file should be mapped</td>
</tr>
</tbody>
</table>
<h3>The aar Goal</h3>
<p>The aar goal allows the following additional parameters:</p>
<table border="2">
<tbody>
<tr>
<td><strong>Parameter Name</strong></td>
<td><strong>Default Value</strong></td>
<td><strong>Description</strong></td>
</tr>
<tr>
<td>outputDirectory</td>
<td>${project.build.directory}</td>
<td>Directory where to generate the AAR file</td>
</tr>
<tr>
<td>aarName</td>
<td>${project.build.finalName}</td>
<td>The generated AAR files name</td>
</tr>
<tr>
<td>archive</td>
<td></td>
<td>A Maven archive configuration. This allows, for example, to
configure the MANIFEST.MF file</td>
</tr>
<tr>
<td>classifier</td>
<td></td>
<td>A classifier, which should be added to the generated AAR files
name. Setting this parameter has the side effect, that the artifact
is treated as an attachment and not as the projects primary
artifact</td>
</tr>
<tr>
<td>primaryArtifact</td>
<td>true</td>
<td>Setting this property to false disables installation or
deployment of the artifact as the projects primary artifact</td>
</tr>
</tbody>
</table>
<a name="file_sets" id="file_sets"></a>
<h3>File Sets</h3>
<p>Additional file sets may be configured for inclusion into the
AAR file. A file set looks as follows:</p>
<pre>
  
  &lt;fileSets&gt;
    &lt;fileSet&gt;
      &lt;directory&gt;src/aar/files&lt;/directory&gt;
      &lt;outputDirectory&gt;META-INF/docs&lt;/outputDirectory&gt;
      &lt;includes&gt;
        &lt;include&gt;**/*.html&lt;/include&gt;

      &lt;/includes&gt;
    &lt;/fileSet&gt;
    &lt;fileSet&gt;
      &lt;directory&gt;src/aar/files&lt;/directory&gt;
      &lt;outputDirectory&gt;META-INF/etc&lt;/outputDirectory&gt;

      &lt;excludes&gt;
        &lt;exclude&gt;**/*.html&lt;/exclude&gt;
      &lt;/excludes&gt;
    &lt;/fileSet&gt;
  &lt;/fileSets&gt;
  
</pre>
<p>The example specifies, that the contents of the directory
src/aar/files shall be added to the AAR file. HTML files will go
into META-INF/docs, all other files to META-INF/etc.</p>
<p>A file set is configured through the following configuration
parameters:</p>
<table border="2">
<tbody>
<tr>
<td><strong>Parameter Name</strong></td>
<td><strong>Description</strong></td>
</tr>
<tr>
<td>directory</td>
<td>The directory, from which to read the file set. This parameter
is required</td>
</tr>
<tr>
<td>outputDirectory</td>
<td>The target directory within the AAR file. Defaults to the AAR
files root directory</td>
</tr>
<tr>
<td>includes</td>
<td>Configures the set of files, which shall be included into the
AAR file. Defaults to **/*</td>
</tr>
<tr>
<td>excludes</td>
<td>Configures a set of files, which shall be excluded from the
file set. Defaults to the Maven default excludes (**/*~,
**/cvs/**/*, **/.svn/**/*, etc.)</td>
</tr>
<tr>
<td>skipDefaultExcludes</td>
<td>If this parameter is set to true, then no default excludes are
being used</td>
</tr>
</tbody>
</table>
</body>
</html>
