 ------
 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 is used to inform your users of the changes that have occurred
  between different releases of your project. The plugin can extract these
  changes, either from a <<<changes.xml>>> file or from an issue
  management system (Jira, Trac and GitHub supported), and presents them as a report.

  You also have the option of creating a release announcement and even sending it via email
  to your users.

* Goals Overview

  * {{{./announcement-mail-mojo.html}changes:announcement-mail}} send a release announcement via email.

  * {{{./announcement-generate-mojo.html}changes:announcement-generate}} generate a release announcement.

  * {{{./changes-check-mojo.html}changes:changes-check}} check that the <<<changes.xml>>> file contains a valid release date.

  * {{{./changes-validate-mojo.html}changes:changes-validate}} validate the <<<changes.xml>>> file.

  * {{{./changes-report-mojo.html}changes:changes-report}} create a report from <<<changes.xml>>> file.

  * {{{./jira-report-mojo.html}changes:jira-report}} create a report from issues downloaded from {{{http://www.atlassian.com/software/jira/}JIRA}}.

  * {{{./trac-report-mojo.html}changes:trac-report}} create a report from issues downloaded from {{{http://trac.edgewall.org/}Trac}}.
  
  * {{{./github-report-mojo.html}changes:github-report}} create a report from issues downloaded from {{{http://github.com/}GitHub}}.

  []

* Usage

  General instructions on how to use the Changes 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/Changes+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 of some usages of the Changes Plugin,
  you can take a look at the following examples:

  * {{{./examples/alternate-changes-xml-location.html}Alternate Location for the <<<changes.xml>>> File}}

  * {{{./examples/check-changes-file.html}Check Your <<<changes.xml>>> File}}

  * {{{./examples/configuring-trac-report.html}Configuring the Trac Report}}

  * {{{./examples/customizing-jira-report.html}Customizing the JIRA Report}}
  
  * {{{./examples/configuring-github-report.html}Configuring the GitHub Report}}

  * {{{./examples/include-announcement-file.html}Include an Announcement File in Your Packaging}}

  * {{{./examples/smtp-authentication.html}SMTP authentication}}

  * {{{./examples/specifying-mail-sender.html}Specifying the mail sender}}

  * {{{./examples/using-a-custom-announcement-template.html}Using a Custom Announcement Template}}

  * {{{./examples/changes-file-validation.html}Validate Your <<<changes.xml>>> File}}
