
  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.

                            Apache Rat
                            ==========

Apache Rat is developed by the Apache Creadur project of the Apache Software
Foundation. Join us at http://creadur.apache.org and read more about Apache Rat
at http://creadur.apache.org/rat.

Release Audit Tool (Rat) is a tool to improve accuracy and efficiency when checking
releases. It is heuristic in nature: making guesses about possible problems. It
will produce false positives and cannot find every possible issue with a release.
It's reports require interpretation.

Rat was developed in response to a need felt in the Apache Incubator to be able to
review releases for the most common faults less labour intensively. It is therefore
highly tuned to the Apache style of releases.

Rat is intended to be self documenting: reports should include introductory material
describing their function. Building Rat describes how to run Rat. Running Rat
describes the options available. These release notes describe the current state of
Rat.

A good way to use Rat is to through the source. This allows the code base to be
easily patched for example to add new generated file matchers. The main jar is
runnable and self-documenting. This jar is available as a standard alone binary.

Rat includes a task library for Ant 1.7. This allows Rat reports to be run against
a wide variety of resources. See ant-task-examples.xml. To use the Ant tasks,
Apache Ant 1.7 is required. See http://ant.apache.org/.

For Maven builds, the plugin is recommended.

In response to demands from project quality tool developers, Rat is available as a
library (rat-lib jar) suitable for inclusion in tools. Note that binary compatibility
is not gauranteed between 0.x releases. The XML output format is not yet in it's
final form and so library users are recommended to either use the supplied
stylesheets or keep in close touch with the code.

