~~ 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.    
 
  ------
  Built-In Rules
  ------
  Brian Fox
  ------
  2015-01-27
  ------

Built-In Rules

  The following built-in rules ship along with the enforcer plugin:

  * {{{./alwaysFail.html}alwaysFail}} - Always fail... used to test plugin configuration.

  * {{{./alwaysPass.html}alwaysPass}} - Always passes... used to test plugin configuration.

  * {{{./banDependencyManagementScope.html}banDependencyManagementScope}} - bans all scope values except for 'import' from dependencies within the dependency management.
  
  * {{{./banDistributionManagement.html}banDistributionManagement}} - enforces that project doesn't have distributionManagement.
  
  * {{{./banDuplicatePomDependencyVersions.html}banDuplicatePomDependencyVersions}} - enforces that the project doesn't have duplicate declared dependencies.
  
  * {{{./banDynamicVersions.html}banDynamicVersions}} - bans all dependencies requiring version resolution at build time (i.e. version ranges, placeholders <<<RELEASE>>>/<<<LATEST>>> or SNAPSHOT versions).
  
  * {{{./bannedDependencies.html}bannedDependencies}} - enforces that excluded dependencies aren't included.
  
  * {{{./bannedPlugins.html}bannedPlugins}} - enforces that specific plugins aren't included in the build.
  
  * {{{./bannedRepositories.html}bannedRepositories}} - enforces to not include banned repositories.

  * {{{./banTransitiveDependencies.html}banTransitiveDependencies}} - enforces that project doesn't have transitive dependencies.

  * {{{./dependencyConvergence.html}dependencyConvergence}} - ensure all dependencies converge to the same version.

  * {{{./evaluateBeanshell.html}evaluateBeanshell}} - evaluates a beanshell script.

  * {{{./externalRules.html}externalRules}} - evaluate rules from an external resource.

  * {{{./reactorModuleConvergence.html}reactorModuleConvergence}} - enforces that a multi module build follows best practice.

  * {{{./requireActiveProfile.html}requireActiveProfile}} - enforces one or more active profiles.
  
  * {{{./requireEnvironmentVariable.html}requireEnvironmentVariable}} - enforces the existence of an environment variable.

  * {{{./requireExplicitDependencyScope.html}requireExplicitDependencyScope}} - enforces that all dependencies have an explicit scope.

  * {{{./requireFileChecksum.html}requireFileChecksum}} - enforces that the specified file has a certain checksum.
  
  * {{{./requireFilesDontExist.html}requireFilesDontExist}} - enforces that the list of files does not exist.
  
  * {{{./requireFilesExist.html}requireFilesExist}} - enforces that the list of files does exist.

  * {{{./requireFilesSize.html}requireFilesSize}} - enforces that the list of files exists and is within a certain size range.

  * {{{./requireJavaVendor.html}requireJavaVendor}} - enforces the JDK vendor.

  * {{{./requireJavaVersion.html}requireJavaVersion}} - enforces the JDK version.

  * {{{./requireMavenVersion.html}requireMavenVersion}} - enforces the Maven version.

  * {{{./requireNoRepositories.html}requireNoRepositories}} - enforces to not include repositories.

  * {{{./requireOS.html}requireOS}} - enforces the OS / CPU Architecture.

  * {{{./requirePluginVersions.html}requirePluginVersions}} - enforces that all plugins have a specified version.

  * {{{./requirePrerequisite.html}requirePrerequisite}} - enforces that prerequisites have been specified.
   
  * {{{./requireProfileIdsExist.html}requireProfileIdsExist}} - enforces the existence of profiles specified on the commandline.
   
  * {{{./requireProperty.html}requireProperty}} - enforces the existence and values of properties.
   
  * {{{./requireReleaseDeps.html}requireReleaseDeps}} - enforces that no snapshots are included as dependencies.

  * {{{./requireReleaseVersion.html}requireReleaseVersion}} - enforces that the artifact is not a snapshot.

  * {{{./requireSnapshotVersion.html}requireSnapshotVersion}} - enforces that the artifact is not a release.

  * {{{./requireSameVersions.html}requireSameVersions}} - enforces that specific dependencies and/or plugins have the same version.

  * {{{./requireTextFileChecksum.html}requireTextFileChecksum}} - enforces that the specified text file has a certain checksum (after normalizing line separators).

  * {{{./requireUpperBoundDeps.html}requireUpperBoundDeps}} - ensures that every (transitive) dependency is resolved to its specified version or higher.

  []

  You may also create and inject your own custom rules by following the {{{https://maven.apache.org/enforcer/enforcer-api/writing-a-custom-rule.html}maven-enforcer-rule-api}} instructions.
