 ------
 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
  {{http://www.oracle.com/us/technologies/java/enterprise-edition/overview/index.html}}.

* 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 {{{./mail-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 {{{./mail-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-tracking.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
  {{{./source-repository.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/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)}}

  []
