 ------
 Introduction
 ------
 Stephane Nicoll
 <snicoll@apache.org>
 Pete Marvin King
 ------
 2015-11-11
 ------

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

 ~~ 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 Enterprise JavaBean (EJB) file as well as the associated client jar.

* Goals Overview

  {{{./ejb-mojo.html}ejb:ejb}} - used by Maven for projects with <<<ejb>>> package type.

* Usage

  General instructions on how to use the EJB Plugin can be found on the {{{./usage.html}usage page}}. Some more
  specific use cases are described in the examples given below. 

  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
  {{{/guides/development/guide-helping.html}guide to helping with Maven}}.
  
  Important Note: Starting with version 3.0.0 of the plugin all user properties have been removed which means
  you can't use a property on the command line anymore to configure maven-ejb-plugin. The configuration
  of the plugin has be done in the <<<pom.xml>>> file instead.

* Examples

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

  * {{{./examples/filter-deployment-descriptor.html}Filter the deployment descriptor}}

  * {{{./examples/generating-ejb-client.html}Generating an EJB client}}

  * {{{./examples/ejb-client-dependency.html}Using the ejb-client as a dependency}}

  []

* Related Links

  * {{{/shared/maven-archiver/index.html}How to configure the archive, including its manifest}}

  []
