 ------
 Introduction
 ------
 Dennis Lundberg
 ------
 2013-07-22
 ------

 ~~ 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 provides the capability to build jars.
  If you like to sign jars please use the 
  {{{http://maven.apache.org/plugins/maven-jarsigner-plugin/}Maven Jarsigner Plugin}}.

* Goals Overview

  * {{{./jar-mojo.html}jar:jar}} create a jar file for your project classes inclusive resources.

  * {{{./test-jar-mojo.html}jar:test-jar}} create a jar file for your project test classes .

  []

* Usage

  General instructions on how to use the JAR Plugin can be found on the {{{./usage.html}usage page}}. Some more
  specific use cases are described in the examples given below. Last but not least, users occasionally contribute
  additional examples, tips or errata to the
  {{{http://docs.codehaus.org/display/MAVENUSER/JAR+Plugin}plugin's wiki page}}.

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

* Archiver Configuration

  The plugin use Maven Archiver to handle jar content and manifest configuration.

  You can have a look at the {{{http://maven.apache.org/shared/maven-archiver/}Maven Archiver Documentation}} to understand how to setup this.

  You might also want to consult the {{{http://maven.apache.org/guides/mini/guide-manifest.html}Guide
  to Working with Manifests}}.

* Examples

  To provide you with better understanding of some usages of the JAR Plugin,
  you can take a look at the following examples:

  * {{{./examples/manifest-customization.html}Manifest Customization}}

  * {{{./examples/default-manifest-file.html}Using a Default Manifest File}}

  * {{{./examples/include-exclude.html}Howto include/exclude Content from a jar archive}}

  * {{{./examples/attached-jar.html}How to create an additional attached jar artifact from the project}}

  * {{{./examples/create-test-jar.html}How to create a jar containing test classes}}

  []
