This is an automated email from the ASF dual-hosted git repository.

sjaranowski pushed a commit to branch MENFORCER-469
in repository https://gitbox.apache.org/repos/asf/maven-enforcer.git

commit 8ddf0c00e6ed3e0f20cad22ef60d4d87ff74a4fc
Author: Slawomir Jaranowski <[email protected]>
AuthorDate: Sat Mar 11 20:54:02 2023 +0100

    [MENFORCER-469] Fix banTransitiveDependencies and transitive dependencies 
with another version than the resolved one
    
    - rename ResolveUtil to ResolverUtil
    
    - introduce methods:
    
     - resolveTransitiveDependenciesVerbose
       resolve with full tree contains all dependencies - also conflicted
    
     - resolveTransitiveDependencies
       resolve final tree contains dependencies after conflict resolved
---
 .../dependency/BanTransitiveDependencies.java      |  8 +--
 .../rules/dependency/BannedDependencies.java       |  4 +-
 .../rules/dependency/BannedDependenciesBase.java   |  8 +--
 .../rules/dependency/DependencyConvergence.java    |  8 +--
 .../rules/dependency/RequireReleaseDeps.java       |  4 +-
 .../rules/dependency/RequireUpperBoundDeps.java    |  8 +--
 .../{ResolveUtil.java => ResolverUtil.java}        | 53 ++++++++++------
 .../rules/dependency/BannedDependenciesTest.java   |  6 +-
 .../rules/dependency/RequireReleaseDepsTest.java   | 23 +++----
 .../dependency/RequireUpperBoundDepsTest.java      |  4 +-
 .../pom.xml                                        | 70 ++++++++++++++++++++++
 .../pom.xml                                        | 69 +++++++++++++++++++++
 12 files changed, 213 insertions(+), 52 deletions(-)

diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BanTransitiveDependencies.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BanTransitiveDependencies.java
index 212d3e4..4bf2b6e 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BanTransitiveDependencies.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BanTransitiveDependencies.java
@@ -68,12 +68,12 @@ public final class BanTransitiveDependencies extends 
AbstractStandardEnforcerRul
 
     private final MavenSession session;
 
-    private final ResolveUtil resolveUtil;
+    private final ResolverUtil resolverUtil;
 
     @Inject
-    public BanTransitiveDependencies(MavenSession session, ResolveUtil 
resolveUtil) {
+    public BanTransitiveDependencies(MavenSession session, ResolverUtil 
resolverUtil) {
         this.session = Objects.requireNonNull(session);
-        this.resolveUtil = Objects.requireNonNull(resolveUtil);
+        this.resolverUtil = Objects.requireNonNull(resolverUtil);
     }
 
     /**
@@ -147,7 +147,7 @@ public final class BanTransitiveDependencies extends 
AbstractStandardEnforcerRul
                 .map(d -> RepositoryUtils.toDependency(d, 
artifactTypeRegistry))
                 .collect(Collectors.toSet());
 
-        DependencyNode rootNode = resolveUtil.resolveTransitiveDependencies();
+        DependencyNode rootNode = resolverUtil.resolveTransitiveDependencies();
         StringBuilder generatedMessage = new StringBuilder();
         if (searchTree(rootNode, 0, exclusions, directDependencies, 
generatedMessage)) {
             throw new 
EnforcerRuleException(ofNullable(getMessage()).orElse(generatedMessage.toString()));
diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependencies.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependencies.java
index 77d2e17..3a03f5e 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependencies.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependencies.java
@@ -34,8 +34,8 @@ import org.apache.maven.execution.MavenSession;
 public final class BannedDependencies extends BannedDependenciesBase {
 
     @Inject
-    BannedDependencies(MavenSession session, ResolveUtil resolveUtil) {
-        super(session, resolveUtil);
+    BannedDependencies(MavenSession session, ResolverUtil resolverUtil) {
+        super(session, resolverUtil);
     }
 
     @Override
diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java
index 4ee240e..ad6cd1c 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java
@@ -67,11 +67,11 @@ abstract class BannedDependenciesBase extends 
AbstractStandardEnforcerRule {
 
     private final MavenSession session;
 
-    private final ResolveUtil resolveUtil;
+    private final ResolverUtil resolverUtil;
 
-    BannedDependenciesBase(MavenSession session, ResolveUtil resolveUtil) {
+    BannedDependenciesBase(MavenSession session, ResolverUtil resolverUtil) {
         this.session = Objects.requireNonNull(session);
-        this.resolveUtil = Objects.requireNonNull(resolveUtil);
+        this.resolverUtil = Objects.requireNonNull(resolverUtil);
     }
 
     protected MavenSession getSession() {
@@ -102,7 +102,7 @@ abstract class BannedDependenciesBase extends 
AbstractStandardEnforcerRule {
             }
         } else {
             StringBuilder messageBuilder = new StringBuilder();
-            DependencyNode rootNode = 
resolveUtil.resolveTransitiveDependencies();
+            DependencyNode rootNode = 
resolverUtil.resolveTransitiveDependenciesVerbose();
             if (!validate(rootNode, 0, messageBuilder)) {
                 String message = "";
                 if (getMessage() != null) {
diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java
index eb583c7..b742cd2 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java
@@ -52,17 +52,17 @@ public final class DependencyConvergence extends 
AbstractStandardEnforcerRule {
 
     private DependencyVersionMap dependencyVersionMap;
 
-    private final ResolveUtil resolveUtil;
+    private final ResolverUtil resolverUtil;
 
     @Inject
-    public DependencyConvergence(ResolveUtil resolveUtil) {
-        this.resolveUtil = Objects.requireNonNull(resolveUtil);
+    public DependencyConvergence(ResolverUtil resolverUtil) {
+        this.resolverUtil = Objects.requireNonNull(resolverUtil);
     }
 
     @Override
     public void execute() throws EnforcerRuleException {
 
-        DependencyNode node = resolveUtil.resolveTransitiveDependencies(
+        DependencyNode node = 
resolverUtil.resolveTransitiveDependenciesVerbose(
                 // TODO: use a modified version of ExclusionDependencySelector 
to process excludes and includes
                 new DependencySelector() {
                     @Override
diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDeps.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDeps.java
index 246ae7c..48d4e33 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDeps.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDeps.java
@@ -51,8 +51,8 @@ public final class RequireReleaseDeps extends 
BannedDependenciesBase {
     private boolean failWhenParentIsSnapshot = true;
 
     @Inject
-    public RequireReleaseDeps(MavenSession session, ResolveUtil resolveUtil) {
-        super(session, resolveUtil);
+    public RequireReleaseDeps(MavenSession session, ResolverUtil resolverUtil) 
{
+        super(session, resolverUtil);
     }
 
     // Override parent to allow optional ignore of this rule.
diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java
index 27f7889..9157bd9 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java
@@ -71,11 +71,11 @@ public final class RequireUpperBoundDeps extends 
AbstractStandardEnforcerRule {
 
     private RequireUpperBoundDepsVisitor upperBoundDepsVisitor;
 
-    private final ResolveUtil resolveUtil;
+    private final ResolverUtil resolverUtil;
 
     @Inject
-    public RequireUpperBoundDeps(ResolveUtil resolveUtil) {
-        this.resolveUtil = Objects.requireNonNull(resolveUtil);
+    public RequireUpperBoundDeps(ResolverUtil resolverUtil) {
+        this.resolverUtil = Objects.requireNonNull(resolverUtil);
     }
 
     /**
@@ -97,7 +97,7 @@ public final class RequireUpperBoundDeps extends 
AbstractStandardEnforcerRule {
 
     @Override
     public void execute() throws EnforcerRuleException {
-        DependencyNode node = resolveUtil.resolveTransitiveDependencies();
+        DependencyNode node = 
resolverUtil.resolveTransitiveDependenciesVerbose();
         upperBoundDepsVisitor = new RequireUpperBoundDepsVisitor()
                 .setUniqueVersions(uniqueVersions)
                 .setIncludes(includes);
diff --git 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java
 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolverUtil.java
similarity index 73%
rename from 
enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java
rename to 
enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolverUtil.java
index 1337fed..fa95587 100644
--- 
a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java
+++ 
b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolverUtil.java
@@ -39,33 +39,47 @@ import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.DependencyNode;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
 import org.eclipse.aether.util.graph.selector.AndDependencySelector;
-import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
-import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
-import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
 
 import static java.util.Optional.ofNullable;
-import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED;
-import static org.apache.maven.artifact.Artifact.SCOPE_TEST;
 
 /**
  * Resolver helper class.
  */
 @Named
-class ResolveUtil {
+class ResolverUtil {
 
     private final RepositorySystem repositorySystem;
+
     private final MavenSession session;
 
     /**
      * Default constructor
      */
     @Inject
-    ResolveUtil(RepositorySystem repositorySystem, MavenSession session) {
+    ResolverUtil(RepositorySystem repositorySystem, MavenSession session) {
         this.repositorySystem = Objects.requireNonNull(repositorySystem);
         this.session = Objects.requireNonNull(session);
     }
 
+    /**
+     * Retrieves the {@link DependencyNode} instance containing the result of 
the transitive dependency
+     * for the current {@link MavenProject} in verbose mode.
+     * <p>
+     * In verbose mode all nodes participating in a conflict are retained.
+     * </p>
+     * <p>
+     * Please consult {@link ConflictResolver} and {@link 
DependencyManagerUtils}>
+     * /p>
+     *
+     * @param selectors zero or more {@link DependencySelector} instances
+     * @return a Dependency Node which is the root of the project's dependency 
tree
+     * @throws EnforcerRuleException thrown if the lookup fails
+     */
+    DependencyNode resolveTransitiveDependenciesVerbose(DependencySelector... 
selectors) throws EnforcerRuleException {
+        return resolveTransitiveDependencies(true, selectors);
+    }
+
     /**
      * Retrieves the {@link DependencyNode} instance containing the result of 
the transitive dependency
      * for the current {@link MavenProject}.
@@ -75,13 +89,12 @@ class ResolveUtil {
      * @throws EnforcerRuleException thrown if the lookup fails
      */
     DependencyNode resolveTransitiveDependencies(DependencySelector... 
selectors) throws EnforcerRuleException {
-        if (selectors.length == 0) {
-            selectors = new DependencySelector[] {
-                new ScopeDependencySelector(SCOPE_TEST, SCOPE_PROVIDED),
-                new OptionalDependencySelector(),
-                new ExclusionDependencySelector()
-            };
-        }
+        return resolveTransitiveDependencies(false, selectors);
+    }
+
+    private DependencyNode resolveTransitiveDependencies(boolean verbose, 
DependencySelector... selectors)
+            throws EnforcerRuleException {
+
         try {
             MavenProject project = session.getCurrentProject();
             ArtifactTypeRegistry artifactTypeRegistry =
@@ -89,9 +102,15 @@ class ResolveUtil {
 
             DefaultRepositorySystemSession repositorySystemSession =
                     new 
DefaultRepositorySystemSession(session.getRepositorySession());
-            
repositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, 
true);
-            
repositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE,
 true);
-            repositorySystemSession.setDependencySelector(new 
AndDependencySelector(selectors));
+
+            if (selectors.length > 0) {
+                repositorySystemSession.setDependencySelector(new 
AndDependencySelector(selectors));
+            }
+
+            if (verbose) {
+                
repositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, 
true);
+                
repositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE,
 true);
+            }
 
             CollectRequest collectRequest = new CollectRequest(
                     project.getDependencies().stream()
diff --git 
a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java
 
b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java
index 69ad445..c01748c 100644
--- 
a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java
+++ 
b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java
@@ -51,7 +51,7 @@ class BannedDependenciesTest {
     private MavenSession session;
 
     @Mock
-    private ResolveUtil resolveUtil;
+    private ResolverUtil resolverUtil;
 
     @InjectMocks
     private BannedDependencies rule;
@@ -94,7 +94,7 @@ class BannedDependenciesTest {
     @Test
     void excludesUseTransitiveDependencies() throws Exception {
 
-        when(resolveUtil.resolveTransitiveDependencies())
+        when(resolverUtil.resolveTransitiveDependenciesVerbose())
                 .thenReturn(new DependencyNodeBuilder()
                         .withType(DependencyNodeBuilder.Type.POM)
                         .withChildNode(new DependencyNodeBuilder()
@@ -127,7 +127,7 @@ class BannedDependenciesTest {
     @Test
     void excludesAndIncludesUseTransitiveDependencies() throws Exception {
 
-        when(resolveUtil.resolveTransitiveDependencies())
+        when(resolverUtil.resolveTransitiveDependenciesVerbose())
                 .thenReturn(new DependencyNodeBuilder()
                         .withType(DependencyNodeBuilder.Type.POM)
                         .withChildNode(new DependencyNodeBuilder()
diff --git 
a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java
 
b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java
index b1409a6..676479d 100644
--- 
a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java
+++ 
b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java
@@ -56,7 +56,7 @@ class RequireReleaseDepsTest {
     private MavenSession session;
 
     @Mock
-    private ResolveUtil resolveUtil;
+    private ResolverUtil resolverUtil;
 
     @InjectMocks
     private RequireReleaseDeps rule;
@@ -75,12 +75,12 @@ class RequireReleaseDepsTest {
 
         assertThatCode(rule::execute).doesNotThrowAnyException();
 
-        verifyNoInteractions(resolveUtil);
+        verifyNoInteractions(resolverUtil);
     }
 
     @Test
     void testSearchTransitiveMultipleFailures() throws Exception {
-        
when(resolveUtil.resolveTransitiveDependencies()).thenReturn(getDependencyNodeWithMultipleSnapshots());
+        
when(resolverUtil.resolveTransitiveDependenciesVerbose()).thenReturn(getDependencyNodeWithMultipleSnapshots());
         rule.setSearchTransitive(true);
 
         assertThatCode(rule::execute)
@@ -94,7 +94,7 @@ class RequireReleaseDepsTest {
     @Test
     void testSearchTransitiveNoFailures() throws Exception {
         when(session.getCurrentProject()).thenReturn(project);
-        when(resolveUtil.resolveTransitiveDependencies()).thenReturn(new 
DependencyNodeBuilder().build());
+        
when(resolverUtil.resolveTransitiveDependenciesVerbose()).thenReturn(new 
DependencyNodeBuilder().build());
 
         rule.setSearchTransitive(true);
         assertThatCode(rule::execute).doesNotThrowAnyException();
@@ -108,13 +108,14 @@ class RequireReleaseDepsTest {
 
         assertThatCode(rule::execute).doesNotThrowAnyException();
 
-        verifyNoInteractions(resolveUtil);
+        verifyNoInteractions(resolverUtil);
     }
 
     @Test
     void testWildcardExcludeTests() throws Exception {
         when(session.getCurrentProject()).thenReturn(project);
-        
when(resolveUtil.resolveTransitiveDependencies()).thenReturn(getDependencyNodeWithMultipleTestSnapshots());
+        when(resolverUtil.resolveTransitiveDependenciesVerbose())
+                .thenReturn(getDependencyNodeWithMultipleTestSnapshots());
 
         rule.setExcludes(Collections.singletonList("*:*:*:*:test"));
         rule.setSearchTransitive(true);
@@ -125,7 +126,8 @@ class RequireReleaseDepsTest {
     @Test
     void testWildcardExcludeAll() throws Exception {
         when(session.getCurrentProject()).thenReturn(project);
-        
when(resolveUtil.resolveTransitiveDependencies()).thenReturn(getDependencyNodeWithMultipleTestSnapshots());
+        when(resolverUtil.resolveTransitiveDependenciesVerbose())
+                .thenReturn(getDependencyNodeWithMultipleTestSnapshots());
 
         rule.setExcludes(Collections.singletonList("*"));
         rule.setSearchTransitive(true);
@@ -135,7 +137,8 @@ class RequireReleaseDepsTest {
 
     @Test
     void testExcludesAndIncludes() throws Exception {
-        
when(resolveUtil.resolveTransitiveDependencies()).thenReturn(getDependencyNodeWithMultipleTestSnapshots());
+        when(resolverUtil.resolveTransitiveDependenciesVerbose())
+                .thenReturn(getDependencyNodeWithMultipleTestSnapshots());
 
         rule.setExcludes(Collections.singletonList("*"));
         rule.setIncludes(Collections.singletonList("*:*:*:*:test"));
@@ -161,7 +164,7 @@ class RequireReleaseDepsTest {
     void testFailWhenParentIsSnapshot() throws Exception {
         when(session.getCurrentProject()).thenReturn(project);
         
when(project.getParentArtifact()).thenReturn(ARTIFACT_STUB_FACTORY.getSnapshotArtifact());
-        when(resolveUtil.resolveTransitiveDependencies()).thenReturn(new 
DependencyNodeBuilder().build());
+        
when(resolverUtil.resolveTransitiveDependenciesVerbose()).thenReturn(new 
DependencyNodeBuilder().build());
 
         rule.setFailWhenParentIsSnapshot(true);
 
@@ -174,7 +177,7 @@ class RequireReleaseDepsTest {
     void parentShouldBeExcluded() throws Exception {
         when(session.getCurrentProject()).thenReturn(project);
         
when(project.getParentArtifact()).thenReturn(ARTIFACT_STUB_FACTORY.getSnapshotArtifact());
-        when(resolveUtil.resolveTransitiveDependencies()).thenReturn(new 
DependencyNodeBuilder().build());
+        
when(resolverUtil.resolveTransitiveDependenciesVerbose()).thenReturn(new 
DependencyNodeBuilder().build());
 
         rule.setFailWhenParentIsSnapshot(true);
         rule.setExcludes(Collections.singletonList("testGroupId:*"));
diff --git 
a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java
 
b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java
index 5cbbe30..8741e97 100644
--- 
a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java
+++ 
b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java
@@ -33,7 +33,7 @@ import static org.mockito.Mockito.when;
 class RequireUpperBoundDepsTest {
 
     @Mock
-    private ResolveUtil resolveUtil;
+    private ResolverUtil resolverUtil;
 
     @InjectMocks
     private RequireUpperBoundDeps rule;
@@ -41,7 +41,7 @@ class RequireUpperBoundDepsTest {
     @Test
     void testRule() throws Exception {
 
-        when(resolveUtil.resolveTransitiveDependencies())
+        when(resolverUtil.resolveTransitiveDependenciesVerbose())
                 .thenReturn(new DependencyNodeBuilder()
                         .withType(DependencyNodeBuilder.Type.POM)
                         .withChildNode(new DependencyNodeBuilder()
diff --git 
a/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-direct-dep1/pom.xml
 
b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-direct-dep1/pom.xml
new file mode 100644
index 0000000..01a1d9b
--- /dev/null
+++ 
b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-direct-dep1/pom.xml
@@ -0,0 +1,70 @@
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.enforcer</groupId>
+  <artifactId>ban-transitive-test</artifactId>
+  <version>1.0</version>
+
+  <url>https://issues.apache.org/jira/browse/MENFORCER-469</url>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <banTransitiveDependencies/>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+    </dependency>
+
+    <!-- menforcer128_api the same version as in menforcer128_classic -->
+
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_api</artifactId>
+      <version>1.5.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git 
a/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-direct-dep2/pom.xml
 
b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-direct-dep2/pom.xml
new file mode 100644
index 0000000..ad69e5a
--- /dev/null
+++ 
b/maven-enforcer-plugin/src/it/projects/ban-transitive-dependencies-direct-dep2/pom.xml
@@ -0,0 +1,69 @@
+<?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>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.enforcer</groupId>
+  <artifactId>ban-transitive-test</artifactId>
+  <version>1.0</version>
+
+  <url>https://issues.apache.org/jira/browse/MENFORCER-469</url>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <id>test</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <banTransitiveDependencies/>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_classic</artifactId>
+      <version>0.9.9</version>
+    </dependency>
+
+    <!-- menforcer128_api override version, in menforcer128_classic is 1.5.0 
-->
+    <dependency>
+      <groupId>org.apache.maven.plugins.enforcer.its</groupId>
+      <artifactId>menforcer128_api</artifactId>
+      <version>1.6.0</version>
+    </dependency>
+  </dependencies>
+
+</project>

Reply via email to