 ------
 Introduction
 ------
 Edwin Punzalan
 Stephane Nicoll
 Dennis Lundberg
 ------
 2013-07-22
 ------

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


${project.name}

  This plugin generates Java EE Enterprise Archive (EAR) file. It can also generate
  the deployment descriptor file (e.g. <<<application.xml>>>).

  The EAR plugin supports the following artifacts:

  * ejb

  * war

  * jar

  * ejb-client

  * rar

  * ejb3

  * par

  * sar

  * wsr

  * har

  * app-client

  []

  For available configuration options for these artifacts, please see the
  {{{./modules.html}modules configuration}}.

  For more information about the Java EE technology, please visit {{https://www.oracle.com/java/technologies/java-ee-glance.html}}.

* Version 3.2.0

  {{{./ear-mojo.html#skinnyModules}skinnyModules}} parameter, <<<libDirectory>>> property
  of EAR modules, <<<type>>> property of EAR modules and <<<classPathItem>>> property of
  EAR modules have been implemented.

* Version 3.0.0

  Starting with version 3.0.0 the usage of <<fileNameMapping>> has been removed. If you need
  to use a kind of file name mapping take a look at the new
  {{{./ear-mojo.html#outputFileNameMapping}outputFileNameMapping}} which is more
  flexible.

* Goals Overview

  EAR Plugin has two goals:

  * {{{./ear-mojo.html}ear:ear}} generates J2EE Enterprise Archive (EAR) files.

  * {{{./generate-application-xml-mojo.html}ear:generate-application-xml}}
  generates the deployment descriptor file(s).

* Usage

  General instructions on how to use the EAR Plugin can be found on the {{{./usage.html}usage page}}. Some more
  specific use cases are described in the examples given below. Further real-life examples are given in the plugin's
  {{{./tests.html}test suite}}.

  In case you still have questions regarding the plugin's usage, please have a look at the {{{./faq.html}FAQ}} and feel
  free to contact the {{{./mailing-lists.html}user mailing list}}. The posts to the mailing list are archived and could
  already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching
  the {{{./mailing-lists.html}mail archive}}.

  If you feel like the plugin is missing a feature or has a defect, you can fill a feature request or bug report in our
  {{{./issue-management.html}issue tracker}}. When creating a new issue, please provide a comprehensive description of your
  concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem. For this reason,
  entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated.
  Of course, patches are welcome, too. Contributors can check out the project from our
  {{{./scm.html}source repository}} and will find supplementary information in the
  {{{http://maven.apache.org/guides/development/guide-helping.html}guide to helping with Maven}}.

* Examples

  To provide you with better understanding on some usages of the EAR Plugin,
  you can take a look into the following examples:

  * {{{./examples/filtering-sources.html}Filtering EAR Resources}}

  * {{{./examples/filtering-advanced.html}Advanced Filtering Techniques}}

  * {{{./examples/skinny-wars.html}Creating Skinny WARs}}

  * {{{./examples/skinny-modules.html}Creating Skinny Modules}}

  * {{{./examples/customizing-a-module-filename.html}Customizing A Module
  Filename}}

  * {{{./examples/customizing-context-root.html}Customizing The Context Root}}

  * {{{./examples/customizing-module-location.html}Customizing A Module Location}}

  * {{{./examples/customizing-module-uri.html}Customizing A Module URI}}

  * {{{./examples/excluding-a-module.html}Excluding A Module}}

  * {{{./examples/excluding-files-from-ear.html}Excluding Files From the EAR}}

  * {{{./examples/unpacking-a-module.html}Unpacking A Module}}

  * {{{./examples/including-a-third-party-library-in-application-xml.html}
  Including A Third Party Library In application.xml}}

  * {{{./examples/specifying-security-roles-for-the-generated-application-xml.html}
  Specifying Security Roles For The Generated application.xml}}

  * {{{./examples/specifying-env-entries-for-the-generated-application-xml.html}
    Specifying Environment Entries For The Generated application.xml}}

  * {{{./examples/specifying-resource-ref-entries-for-the-generated-application-xml.html}
    Specifying Resource Ref Entries For The Generated application.xml}}

  * {{{./examples/generating-jboss-app.html} Generating the jboss-app.xml file}}

  * {{{./examples/generating-modules-id.html} Generating modules id}}

  * {{{./examples/using-app-client.html} Using JavaEE application clients}}

  * {{{./examples/eclipse-and-maven-integration.html} Eclipse and Maven integration (without m2e)}}

  []
