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

  ------
  Introduction
  ------
  Brian Fox
  ------
  Mar 2007
  ------

Maven Enforcer Plugin - The Loving Iron Fist of Maven\x99

  The Enforcer plugin provides goals to control certain environmental constraints such as Maven version, JDK version and OS family
  along with many more built-in rules and user created rules.

* Goals Overview

  The Enforcer plugin has two goals:

  *{{{./enforce-mojo.html}enforcer:enforce}} executes rules for each project in a multi-project build.

  *{{{./display-info-mojo.html}enforcer:display-info}} display the current information as detected by the built-in rules.

* Using 3.0.0-M2+

  The minimum needed JDK is now JDK7+.
  
* Usage

  General instructions on how to use the Enforcer Plugin can be found on the {{{./usage.html}usage 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
  {{{/guides/development/guide-helping.html}guide to helping with Maven}}.
