 ------
 Introduction
 ------
 Maria Odea Ching
 ------
 2010-01-20
 ------

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


Maven JXR Plugin

 The JXR Plugin produces a cross-reference of the project's sources. The generated reports make it easier for the user
 to reference or find specific lines of code. It is also handy when used with the PMD Plugin for referencing errors found
 in the code.

* Goals Overview

  The JXR Plugin has 6 goals:

  * {{{./jxr-mojo.html}jxr:jxr}} is used to generate a cross-reference page of the project's main sources. The generated JXR
  files can be linked to the javadocs of the project.

  * {{{./jxr-no-fork-mojo.html}jxr:jxr-nofork}} is used to generate a cross-reference page of the project's main sources without forking the <<<generate-sources>>> phase again. Note that this goal does require generation of main sources before site generation, e.g. by invoking <<<mvn clean deploy site>>>.

  * {{{./aggregate-mojo.html}jxr:aggregate}} is used to generate an aggregated cross-reference page of the project's main sources. The generated JXR files can be linked to the javadocs of the project.

  * {{{./test-jxr-mojo.html}jxr:test-jxr}} on the other hand, is used to generate a cross-reference page of the project's test sources.

  * {{{./test-jxr-no-fork-mojo.html}jxr:test-jxr-nofork}} on the other hand, is used to generate a cross-reference page of the project's test sources. without forking the <<<generate-test-sources>>> phase again. Note that this goal does require generation of test sources before site generation, e.g. by invoking <<<mvn clean deploy site>>>.

  * {{{./test-aggregate-mojo.html}jxr:test-aggregate}} on the other hand, is used to generate an aggregated cross-reference page of the project's test sources.

* Usage

  General instructions on how to use the JXR 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/JXR+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 {{{./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 JXR Plugin,  you can take a look into the
   following examples:

   * {{{./examples/aggregate.html}Aggregating JXR Reports for Multi-Projects}}

   * {{{./examples/linkjavadoc.html}Linking JXR Files to Javadocs}}

   * {{{./examples/nofork.html}Generate JXR without duplicate execution of phase generate-sources}}

   []
