 ------
 Introduction
 ------
 Maria Odea Ching
 ------
 11 July 2006
 ------


Maven Source Plugin

 The Source Plugin creates a jar archive of the source files of the current project. The jar file is, by default,
 created in the project's target directory.

* Goals Overview

   The Source Plugin has five goals:

   * {{{./aggregate-mojo.html}source:aggregate}} aggregrates sources for all modules in an aggregator project.

   * {{{./jar-mojo.html}source:jar}} is used to bundle the main sources of the project into a jar archive.

   * {{{./test-jar-mojo.html}source:test-jar}} on the other hand, is used to bundle the test sources of the project into a
     jar archive.

   * {{{./jar-no-fork-mojo.html}source:jar-no-fork}} is similar to <<jar>> but does not fork the build lifecycle.

   * {{{./test-jar-no-fork-mojo.html}source:test-jar-no-fork}} is similar to <<test-jar>> but does not fork the build lifecycle.

   []

* Usage

  General instructions on how to use the Source 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/Source+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}}.

* Examples

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

   * {{{./examples/configureplugin.html}Configuring Source Plugin}}

  []

