Merge pull request #81 from madlexa/master

simplify code
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 0cd022d..ba6fd0f 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -25,7 +25,7 @@
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macOS-latest]
-        java: [8, 11, 14, 15-ea]
+        java: [8, 11, 14, 15, 16-ea]
       fail-fast: false
 
     runs-on: ${{ matrix.os }}
@@ -35,7 +35,7 @@
         uses: actions/checkout@v2
 
       - name: Set up cache for ~./m2/repository
-        uses: actions/cache@v1
+        uses: actions/cache@v2
         with:
           path: ~/.m2/repository
           key: maven-${{ matrix.os }}-java${{ matrix.java }}-${{ hashFiles('**/pom.xml') }}
diff --git a/.gitignore b/.gitignore
index 907eb16..41ea549 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,8 +5,5 @@
 .idea/
 .svn
 *.iml
-.settings
-.classpath
-.project
 .checkstyle
 
diff --git a/enforcer-api/pom.xml b/enforcer-api/pom.xml
index c27ddd6..0858cfc 100644
--- a/enforcer-api/pom.xml
+++ b/enforcer-api/pom.xml
@@ -41,11 +41,6 @@
       <artifactId>maven-plugin-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-container-default</artifactId>
-      <version>1.0-alpha-9</version>
-    </dependency>
-    <dependency>
       <groupId>com.google.code.findbugs</groupId>
       <artifactId>jsr305</artifactId>
       <version>3.0.0</version>
diff --git a/enforcer-api/src/main/assembly/custom-rule-sample.xml b/enforcer-api/src/main/assembly/custom-rule-sample.xml
index 5b72b90..63eb1c1 100644
--- a/enforcer-api/src/main/assembly/custom-rule-sample.xml
+++ b/enforcer-api/src/main/assembly/custom-rule-sample.xml
@@ -18,9 +18,9 @@
   * under the License. 
   *
 -->
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 https://maven.apache.org/xsd/assembly-2.1.0.xsd">
   <id>sample</id>
   <includeBaseDirectory>false</includeBaseDirectory>
   <formats>
diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml
index 3fb4426..c7d52a6 100644
--- a/enforcer-rules/pom.xml
+++ b/enforcer-rules/pom.xml
@@ -75,9 +75,9 @@
       <artifactId>enforcer-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.beanshell</groupId>
+      <groupId>org.apache-extras.beanshell</groupId>
       <artifactId>bsh</artifactId>
-      <version>2.0b4</version>
+      <version>2.0b6</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
@@ -103,9 +103,11 @@
       <groupId>org.apache.maven.resolver</groupId>
       <artifactId>maven-resolver-util</artifactId>
     </dependency>
+    <!-- needed for ArtifactCollector and maven-dependency-tree 2.2 -->
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-compat</artifactId>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.assertj</groupId>
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java
index 50ba869..733f0cd 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireMavenVersion.java
@@ -42,6 +42,11 @@
             MavenSession mavenSession = (MavenSession) helper.evaluate( "${session}" );
             String mavenVersion = mavenSession.getSystemProperties().getProperty( "maven.version" );
             helper.getLog().debug( "Detected Maven Version: " + mavenVersion );
+            if ( mavenVersion == null )
+            {
+                throw new EnforcerRuleException(
+                        "Unable to detect Maven Version - missing system property - maven.version" );
+            }
             DefaultArtifactVersion detectedVersion = new DefaultArtifactVersion( mavenVersion );
             enforceVersion( helper.getLog(), "Maven", getVersion(), detectedVersion );
         }
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
index 0a4ba38..7eee9ae 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
@@ -42,6 +42,7 @@
 import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
 import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
 import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+import org.apache.maven.shared.utils.logging.MessageUtils;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
@@ -253,7 +254,18 @@
         {
             version = uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
         }
-        return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version;
+        String result = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version;
+
+        if ( "compile".equals( artifact.getScope() ) )
+        {
+            return MessageUtils.buffer().strong( result ).toString();
+        }
+        if ( artifact.getScope() != null )
+        {
+            return result + " [" + artifact.getScope() + ']';
+        }
+
+        return result;
     }
 
     private static class RequireUpperBoundDepsVisitor
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
index 29014a5..763a2a5 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
@@ -36,7 +36,6 @@
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.sonatype.aether.RepositorySystemSession;
 
 /**
  * The Class EnforcerTestUtils.
@@ -62,7 +61,7 @@
         when( mer.getSystemProperties() ).thenReturn( systemProperties );
 
         MavenExecutionResult meresult = mock( MavenExecutionResult.class );
-        return new MavenSession( mock, (RepositorySystemSession) null, mer, meresult );
+        return new MavenSession( mock, null, mer, meresult );
     }
 
     /**
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPlexusContainer.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPlexusContainer.java
deleted file mode 100644
index a73cbbd..0000000
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockPlexusContainer.java
+++ /dev/null
@@ -1,662 +0,0 @@
-package org.apache.maven.plugins.enforcer;
-
-/*
- * 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.
- */
-
-import java.io.File;
-import java.io.Reader;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.maven.execution.RuntimeInformation;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.classworlds.ClassRealm;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.PlexusContainerException;
-import org.codehaus.plexus.component.composition.UndefinedComponentComposerException;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
-import org.codehaus.plexus.component.factory.ComponentInstantiationException;
-import org.codehaus.plexus.component.repository.ComponentDescriptor;
-import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.codehaus.plexus.configuration.PlexusConfigurationResourceException;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.logging.LoggerManager;
-
-/**
- * The Class MockPlexusContainer.
- *
- * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
- */
-public class MockPlexusContainer
-    implements PlexusContainer
-{
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookup(java.lang.String)
-     */
-    public Object lookup( String theComponentKey )
-        throws ComponentLookupException
-    {
-        if ( theComponentKey.equals( MavenProject.class.getName() ) )
-        {
-            return new MavenProject();
-        }
-        else if ( theComponentKey.equals( RuntimeInformation.class.getName() ) )
-        {
-            return new MockRuntimeInformation();
-        }
-
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addComponentDescriptor(org.codehaus.plexus.component.repository.ComponentDescriptor)
-     */
-    public void addComponentDescriptor( ComponentDescriptor theComponentDescriptor )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addContextValue(java.lang.Object, java.lang.Object)
-     */
-    public void addContextValue( Object theKey, Object theValue )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addJarRepository(java.io.File)
-     */
-    public void addJarRepository( File theRepository )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#addJarResource(java.io.File)
-     */
-    public void addJarResource( File theResource )
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#composeComponent(java.lang.Object,
-     *      org.codehaus.plexus.component.repository.ComponentDescriptor)
-     */
-    public void composeComponent( Object theComponent, ComponentDescriptor theComponentDescriptor )
-        throws UndefinedComponentComposerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#createChildContainer(java.lang.String, java.util.List, java.util.Map)
-     */
-    public PlexusContainer createChildContainer( String theName, List theClasspathJars, Map theContext )
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#createChildContainer(java.lang.String, java.util.List, java.util.Map,
-     *      java.util.List)
-     */
-    public PlexusContainer createChildContainer( String theName, List theClasspathJars, Map theContext,
-                                                 List theDiscoveryListeners )
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#createComponentInstance(org.codehaus.plexus.component.repository.ComponentDescriptor)
-     */
-    public Object createComponentInstance( ComponentDescriptor theComponentDescriptor )
-        throws ComponentInstantiationException, ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#dispose()
-     */
-    public void dispose()
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getChildContainer(java.lang.String)
-     */
-    public PlexusContainer getChildContainer( String theName )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentDescriptor(java.lang.String)
-     */
-    public ComponentDescriptor getComponentDescriptor( String theComponentKey )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentDescriptorList(java.lang.String)
-     */
-    public List getComponentDescriptorList( String theRole )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentDescriptorMap(java.lang.String)
-     */
-    public Map getComponentDescriptorMap( String theRole )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getComponentRealm(java.lang.String)
-     */
-    public ClassRealm getComponentRealm( String theComponentKey )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getContext()
-     */
-    public Context getContext()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getCreationDate()
-     */
-    public Date getCreationDate()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getLogger()
-     */
-    public Logger getLogger()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#getLoggerManager()
-     */
-    public LoggerManager getLoggerManager()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#hasChildContainer(java.lang.String)
-     */
-    public boolean hasChildContainer( String theName )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#hasComponent(java.lang.String)
-     */
-    public boolean hasComponent( String theComponentKey )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#hasComponent(java.lang.String, java.lang.String)
-     */
-    public boolean hasComponent( String theRole, String theRoleHint )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#initialize()
-     */
-    public void initialize()
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#isInitialized()
-     */
-    public boolean isInitialized()
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#isStarted()
-     */
-    public boolean isStarted()
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookup(java.lang.String, java.lang.String)
-     */
-    public Object lookup( String theRole, String theRoleHint )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookupList(java.lang.String)
-     */
-    public List lookupList( String theRole )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#lookupMap(java.lang.String)
-     */
-    public Map lookupMap( String theRole )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#registerComponentDiscoveryListener(org.codehaus.plexus.component.discovery.ComponentDiscoveryListener)
-     */
-    public void registerComponentDiscoveryListener( ComponentDiscoveryListener theListener )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#release(java.lang.Object)
-     */
-    public void release( Object theComponent )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#releaseAll(java.util.Map)
-     */
-    public void releaseAll( Map theComponents )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#releaseAll(java.util.List)
-     */
-    public void releaseAll( List theComponents )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#removeChildContainer(java.lang.String)
-     */
-    public void removeChildContainer( String theName )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#removeComponentDiscoveryListener(org.codehaus.plexus.component.discovery.ComponentDiscoveryListener)
-     */
-    public void removeComponentDiscoveryListener( ComponentDiscoveryListener theListener )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#resume(java.lang.Object)
-     */
-    public void resume( Object theComponent )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#setConfigurationResource(java.io.Reader)
-     */
-    public void setConfigurationResource( Reader theConfiguration )
-        throws PlexusConfigurationResourceException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#setLoggerManager(org.codehaus.plexus.logging.LoggerManager)
-     */
-    public void setLoggerManager( LoggerManager theLoggerManager )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#setParentPlexusContainer(org.codehaus.plexus.PlexusContainer)
-     */
-    public void setParentPlexusContainer( PlexusContainer theParentContainer )
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#start()
-     */
-    public void start()
-        throws PlexusContainerException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.codehaus.plexus.PlexusContainer#suspend(java.lang.Object)
-     */
-    public void suspend( Object theComponent )
-        throws ComponentLifecycleException
-    {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public <T> T lookup( Class<T> role )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> T lookup( Class<T> role, String hint )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> T lookup( Class<T> type, String role, String hint )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> List<T> lookupList( Class<T> role )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> Map<String, T> lookupMap( Class<T> role )
-        throws ComponentLookupException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean hasComponent( Class<?> role )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean hasComponent( Class<?> role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean hasComponent( Class<?> type, String role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public void addComponent( Object component, String role )
-    {
-        // TODO Auto-generated method stub
-        
-    }
-
-    @Override
-    public <T> void addComponent( T component, Class<?> role, String hint )
-    {
-        // TODO Auto-generated method stub
-        
-    }
-
-    @Override
-    public ComponentDescriptor<?> getComponentDescriptor( String role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> ComponentDescriptor<T> getComponentDescriptor( Class<T> type, String role, String hint )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> List<ComponentDescriptor<T>> getComponentDescriptorList( Class<T> type, String role )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public <T> Map<String, ComponentDescriptor<T>> getComponentDescriptorMap( Class<T> type, String role )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public List<ComponentDescriptor<?>> discoverComponents( org.codehaus.plexus.classworlds.realm.ClassRealm classRealm )
-        throws PlexusConfigurationException
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm getContainerRealm()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm setLookupRealm( org.codehaus.plexus.classworlds.realm.ClassRealm realm )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm getLookupRealm()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public org.codehaus.plexus.classworlds.realm.ClassRealm createChildRealm( String id )
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
index 581bd82..06c9060 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
@@ -22,7 +22,14 @@
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 
-import junit.framework.TestCase;
+import org.apache.maven.execution.MavenSession;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Properties;
+
+import static org.junit.Assert.fail;
 
 /**
  * The Class TestMavenVersion.
@@ -30,7 +37,6 @@
  * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
  */
 public class TestMavenVersion
-    extends TestCase
 {
 
     /**
@@ -38,6 +44,7 @@
      *
      * @throws EnforcerRuleException the enforcer rule exception
      */
+    @Test
     public void testRule()
         throws EnforcerRuleException
     {
@@ -70,8 +77,46 @@
     }
 
     /**
+     * Test few more cases
+     *
+     * @throws EnforcerRuleException the enforcer rule exception
+     */
+    @Test
+    public void checkRequireVersionMatrix() throws EnforcerRuleException, ExpressionEvaluationException
+    {
+        RequireMavenVersion rule = new RequireMavenVersion();
+
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
+        MavenSession mavenSession = (MavenSession) helper.evaluate( "${session}" );
+        Properties systemProperties = mavenSession.getSystemProperties();
+
+        systemProperties.setProperty( "maven.version", "3.6.1" );
+        rule.setVersion( "3.6.0" );
+        rule.execute( helper );
+
+        systemProperties.setProperty( "maven.version", "3.6.2" );
+        rule.setVersion( "3.6.0" );
+        rule.execute( helper );
+        rule.setVersion( "3.6.1" );
+        rule.execute( helper );
+        rule.setVersion( "3.6.2" );
+        rule.execute( helper );
+        rule.setVersion( "3.6.3" );
+        try
+        {
+            rule.execute( helper );
+            fail( "Expected an exception." );
+        }
+        catch ( EnforcerRuleException e )
+        {
+            // expected to catch this.
+        }
+    }
+
+    /**
      * Test id.
      */
+    @Test
     public void testId()
     {
         RequireMavenVersion rule = new RequireMavenVersion();
diff --git a/maven-enforcer-plugin/pom.xml b/maven-enforcer-plugin/pom.xml
index 78a56f5..a3a7518 100644
--- a/maven-enforcer-plugin/pom.xml
+++ b/maven-enforcer-plugin/pom.xml
@@ -159,7 +159,7 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-invoker-plugin</artifactId>
-            <version>3.2.1</version>
+            <version>3.2.2</version>
             <configuration>
               <debug>true</debug>
               <projectsDirectory>src/it/projects</projectsDirectory>
@@ -192,7 +192,7 @@
           <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>mrm-maven-plugin</artifactId>
-            <version>1.0.0</version>
+            <version>1.2.0</version>
             <executions>
               <execution>
                 <goals>
diff --git a/.travis.yml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/invoker.properties
similarity index 80%
rename from .travis.yml
rename to maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/invoker.properties
index e00391c..c98ac4c 100644
--- a/.travis.yml
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/invoker.properties
@@ -15,19 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-language: java
-sudo: false
-
-cache:
-  directories:
-  - "$HOME/.m2"
-
-jobs:
-  include:
-  - stage: test
-    jdk: openjdk11
-    script: mvn verify -Prun-its
-
-branches:
-  only:
-  - master
+invoker.buildResult=failure
\ No newline at end of file
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/pom.xml
new file mode 100644
index 0000000..ef8eddc
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  * 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. 
+  *
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+  <artifactId>menforcer313</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_api</artifactId>
+      <version>1.4.0</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+      <scope>provided</scope>
+      <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <configuration>
+              <rules>
+                <RequireUpperBoundDeps/>
+              </rules>
+            </configuration>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/verify.groovy
new file mode 100644
index 0000000..f916d09
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-deps_failure_show_scopes/verify.groovy
@@ -0,0 +1,31 @@
+/*

+ * 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.

+ */

+def LS = System.getProperty( "line.separator" )

+File buildLog = new File( basedir, 'build.log' )

+

+assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )

+def message = 

+'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 [runtime] paths to dependency are:'+LS+

+'+-org.apache.maven.plugins.enforcer.its:menforcer313:1.0-SNAPSHOT'+LS+

+'  +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 [runtime]'+LS+

+'and'+LS+

+'+-org.apache.maven.plugins.enforcer.its:menforcer313:1.0-SNAPSHOT'+LS+

+'  +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9 [provided]'+LS+

+'    +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 [provided]'+LS

+assert buildLog.text.contains( message )

diff --git a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
index fe985df..4c08b7d 100644
--- a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/pom.xml
@@ -43,7 +43,7 @@
       <plugin>

         <groupId>org.apache.maven.plugins</groupId>

         <artifactId>maven-assembly-plugin</artifactId>

-        <version>3.0.0</version>

+        <version>3.2.0</version>

         <executions>

           <execution>

             <id>assemble</id>

diff --git a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
index a3b5433..1c0f795 100644
--- a/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
+++ b/maven-enforcer-plugin/src/it/projects/resolve_collect_dependencies/src/assembly/extjars.xml
@@ -9,10 +9,10 @@
   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. -->
-<assembly   xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+<assembly   xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
-                                http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+            xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0
+                                https://maven.apache.org/xsd/assembly-2.1.0.xsd">
     <id>extjars</id>
     <formats>
         <format>zip</format>
diff --git a/pom.xml b/pom.xml
index 1d1ea38..6902e5c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,6 +24,7 @@
     <artifactId>maven-parent</artifactId>
     <groupId>org.apache.maven</groupId>
     <version>34</version>
+    <relativePath />
   </parent>
   <groupId>org.apache.maven.enforcer</groupId>
   <artifactId>enforcer</artifactId>
@@ -63,7 +64,7 @@
   </distributionManagement>
 
   <properties>
-    <maven.version>3.0</maven.version>
+    <maven.version>3.1.1</maven.version>
     <maven.site.path>enforcer-archives/enforcer-LATEST</maven.site.path>
     <javaVersion>7</javaVersion>
     <project.build.outputTimestamp>2020-04-17T21:04:00Z</project.build.outputTimestamp>
@@ -107,12 +108,12 @@
         <groupId>org.apache.maven</groupId>
         <artifactId>maven-compat</artifactId>
         <version>${maven.version}</version>
+        <scope>test</scope>
       </dependency>
-
       <dependency>
         <groupId>org.apache.maven.shared</groupId>
         <artifactId>maven-common-artifact-filters</artifactId>
-        <version>3.1.0</version>
+        <version>3.2.0</version>
       </dependency>
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
@@ -122,7 +123,7 @@
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.13</version>
+        <version>4.13.1</version>
       </dependency>
       <dependency>
         <groupId>org.mockito</groupId>
@@ -138,18 +139,24 @@
       <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
-        <version>1.14</version>
+        <version>1.15</version>
       </dependency>
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
-        <version>2.5</version><!-- same version as used by maven-shared-utils -->
+        <version>2.6</version>
       </dependency>
       <dependency>
         <groupId>org.apache.maven.plugin-testing</groupId>
         <artifactId>maven-plugin-testing-harness</artifactId>
-        <version>2.1</version>
+        <version>3.1.0</version>
         <scope>test</scope>
+        <exclusions>
+          <exclusion>
+            <artifactId>plexus-container-default</artifactId>
+            <groupId>org.codehaus.plexus</groupId>
+          </exclusion>
+        </exclusions>
       </dependency>
       <dependency>
         <groupId>org.apache.maven.shared</groupId>
@@ -159,12 +166,12 @@
       <dependency>
         <groupId>org.apache.maven.resolver</groupId>
         <artifactId>maven-resolver-util</artifactId>
-        <version>1.4.1</version>
+        <version>1.6.1</version>
       </dependency>
       <dependency>
         <groupId>org.assertj</groupId>
         <artifactId>assertj-core</artifactId>
-        <version>1.7.1</version>
+        <version>2.9.1</version><!-- Java 7 -->
       </dependency>
     </dependencies>
   </dependencyManagement>