You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2019/09/28 09:37:22 UTC

[maven-dependency-plugin] 01/04: Resolve dependencies and plugins transitively

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

rfscholte pushed a commit to branch MDEP-204
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git

commit f4728688934bdbeff6af5e4e3ba2073e75451dc6
Author: Maarten Mulders <m....@xs4all.nl>
AuthorDate: Thu Sep 12 13:13:58 2019 +0200

    Resolve dependencies and plugins transitively
    
    Verify this actually happened by invoking package -o afterwards
---
 pom.xml                                            | 22 ++++-
 .../invoker.properties                             |  4 +-
 .../module-1/pom.xml                               |  6 +-
 .../module-2/pom.xml                               |  7 ++
 .../ExcludeReactorProjectsDependencyFilter.java    | 89 ++++++++++++++++++++
 .../dependency/resolvers/GoOfflineMojo.java        | 94 +++++++++++++++-------
 .../maven/plugins/dependency/TestGetMojo.java      | 12 ++-
 ...ExcludeReactorProjectsDependencyFilterTest.java |  8 ++
 8 files changed, 203 insertions(+), 39 deletions(-)

diff --git a/pom.xml b/pom.xml
index 35c1ac5..35e4f5a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -90,6 +90,7 @@ under the License.
 
   <properties>
     <mavenVersion>3.0</mavenVersion>
+<!--    <mavenVersion>3.6.2</mavenVersion>-->
     <doxiaVersion>1.4</doxiaVersion>
     <pluginTestingVersion>2.1</pluginTestingVersion>
     <javaVersion>7</javaVersion>
@@ -131,6 +132,25 @@ under the License.
       <version>${mavenVersion}</version>
     </dependency>
 
+<!--    <dependency>-->
+<!--      <groupId>org.eclipse.aether</groupId>-->
+<!--      <artifactId>aether-api</artifactId>-->
+<!--      <version>0.9.0.M2</version>-->
+<!--&lt;!&ndash;      <scope>provided</scope>&ndash;&gt;-->
+<!--    </dependency>-->
+<!--    <dependency>-->
+<!--      <groupId>org.eclipse.aether</groupId>-->
+<!--      <artifactId>aether-util</artifactId>-->
+<!--      <version>0.9.0.M2</version>-->
+<!--      &lt;!&ndash; provided scoped dependencies aren't shaded &ndash;&gt;-->
+<!--    </dependency>-->
+<!--    <dependency>-->
+<!--      <groupId>org.eclipse.aether</groupId>-->
+<!--      <artifactId>aether-impl</artifactId>-->
+<!--      <version>0.9.0.M2</version>-->
+<!--&lt;!&ndash;      <scope>provided</scope>&ndash;&gt;-->
+<!--    </dependency>-->
+
     <!-- reporting -->
     <dependency>
       <groupId>org.apache.maven.reporting</groupId>
@@ -396,7 +416,7 @@ under the License.
                 <pomExclude>tree-verbose/pom.xml</pomExclude>
               </pomExcludes>
               <pomIncludes>
-                <pomInclude>*/pom.xml</pomInclude>
+                <pomInclude>mdep-204-go-offline-resolve-intermodule/pom.xml</pomInclude>
                 <pomInclude>purge-local-repository-without-pom</pomInclude>
               </pomIncludes>
               <!-- for mrm -->
diff --git a/src/it/projects/mdep-204-go-offline-resolve-intermodule/invoker.properties b/src/it/projects/mdep-204-go-offline-resolve-intermodule/invoker.properties
index e596121..62d6a13 100644
--- a/src/it/projects/mdep-204-go-offline-resolve-intermodule/invoker.properties
+++ b/src/it/projects/mdep-204-go-offline-resolve-intermodule/invoker.properties
@@ -15,4 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:go-offline
+invoker.goals.1 = ${project.groupId}:${project.artifactId}:${project.version}:go-offline
+# After go-offline, we should be able to build without pulling in new dependencies
+invoker.goals.2 = package -o
diff --git a/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-1/pom.xml b/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-1/pom.xml
index 94f4dea..07bec40 100644
--- a/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-1/pom.xml
+++ b/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-1/pom.xml
@@ -33,9 +33,9 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-project</artifactId>
-            <version>2.2.1</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.9</version>
         </dependency>
     </dependencies>
 
diff --git a/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-2/pom.xml b/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-2/pom.xml
index 7fa4c20..50f7922 100644
--- a/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-2/pom.xml
+++ b/src/it/projects/mdep-204-go-offline-resolve-intermodule/module-2/pom.xml
@@ -37,6 +37,13 @@
             <artifactId>test-sub-1</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+
+        <!-- this dependency should pull in a few transitive dependencies -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ExcludeReactorProjectsDependencyFilter.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ExcludeReactorProjectsDependencyFilter.java
new file mode 100644
index 0000000..e5d90ca
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ExcludeReactorProjectsDependencyFilter.java
@@ -0,0 +1,89 @@
+package org.apache.maven.plugins.dependency.resolvers;
+
+/*
+ * 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 org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.artifact.filter.resolve.AbstractFilter;
+import org.apache.maven.shared.artifact.filter.resolve.Node;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * {@link TransformableFilter} implementation that excludes artifacts found in the Reactor.
+ *
+ * @author Maarten Mulders
+ */
+public class ExcludeReactorProjectsDependencyFilter extends AbstractFilter
+{
+    private final Log log;
+    private final Set<String> reactorArtifactKeys;
+
+    public ExcludeReactorProjectsDependencyFilter( final List<MavenProject> reactorProjects, final Log log )
+    {
+        this.log = log;
+        this.reactorArtifactKeys = new HashSet<>( reactorProjects.size() );
+        for ( final MavenProject project : reactorProjects )
+        {
+            this.reactorArtifactKeys.add( ArtifactUtils.key( project.getArtifact() ) );
+        }
+    }
+
+    @Override
+    public boolean accept( final Node node, final List<Node> parents )
+    {
+        final Dependency dependency = node.getDependency();
+        if ( dependency != null )
+        {
+            final String dependencyArtifactKey = ArtifactUtils.key(
+                    dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
+
+            final boolean result = isDependencyArtifactInReactor( dependencyArtifactKey );
+
+            if ( log.isDebugEnabled() && result )
+            {
+                log.debug( "Skipped dependency "
+                        + dependencyArtifactKey
+                        + " because it is present in the reactor" );
+            }
+
+            return !result;
+        }
+        return true;
+    }
+
+    private boolean isDependencyArtifactInReactor( final String dependencyArtifactKey )
+    {
+        for ( final String reactorArtifactKey : this.reactorArtifactKeys )
+        {
+            // This check only includes GAV. Should we take a look at the types, too?
+            if ( reactorArtifactKey.equals( dependencyArtifactKey ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java
index 9309801..3c20665 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java
@@ -20,16 +20,19 @@ package org.apache.maven.plugins.dependency.resolvers;
  */
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
 import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
-import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
-import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
+import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
 
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -78,7 +81,7 @@ public class GoOfflineMojo
             }
 
         }
-        catch ( ArtifactFilterException | ArtifactResolverException e )
+        catch ( DependencyResolverException e )
         {
             throw new MojoExecutionException( e.getMessage(), e );
         }
@@ -89,27 +92,60 @@ public class GoOfflineMojo
      * This method resolves the dependency artifacts from the project.
      *
      * @return set of resolved dependency artifacts.
-     * @throws ArtifactFilterException in case of an error while filtering the artifacts.
-     * @throws ArtifactResolverException in case of an error while resolving the artifacts.
+     * @throws DependencyResolverException in case of an error while resolving the artifacts.
      */
     protected Set<Artifact> resolveDependencyArtifacts()
-            throws ArtifactFilterException, ArtifactResolverException
+            throws DependencyResolverException
     {
-        final Set<Artifact> artifacts = getProject().getDependencyArtifacts();
+        final Collection<Dependency> dependencies = getProject().getDependencies();
+        final ProjectBuildingRequest buildingRequest =
+                new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
 
-        return resolveFilteredArtifacts( artifacts );
+        return resolveArtifacts( buildingRequest, dependencies );
+    }
+
+    private Set<Artifact> resolveArtifacts( final ProjectBuildingRequest buildingRequest,
+                                            final Collection<Dependency> dependencies )
+            throws DependencyResolverException
+    {
+        final TransformableFilter filter = getTransformableFilter();
+
+        final Iterable<ArtifactResult> artifactResults = getDependencyResolver().resolveDependencies(
+                buildingRequest, dependencies, null, filter );
+
+        final Set<Artifact> results = new HashSet<>();
+
+        for ( final ArtifactResult artifactResult : artifactResults )
+        {
+            results.add( artifactResult.getArtifact() );
+        }
+
+        return results;
+    }
+
+    private TransformableFilter getTransformableFilter()
+    {
+        if ( this.excludeReactor )
+        {
+            return new ExcludeReactorProjectsDependencyFilter( this.reactorProjects, getLog() );
+        }
+        else
+        {
+            return null;
+        }
     }
 
     /**
      * This method resolves the plugin artifacts from the project.
      *
      * @return set of resolved plugin artifacts.
-     * @throws ArtifactFilterException in case of an error while filtering the artifacts.
-     * @throws ArtifactResolverException in case of an error while resolving the artifacts.
+     * @throws DependencyResolverException in case of an error while resolving the artifacts.
      */
     protected Set<Artifact> resolvePluginArtifacts()
-            throws ArtifactFilterException, ArtifactResolverException
+            throws DependencyResolverException
     {
+        final Set<Dependency> dependencies = new HashSet<>();
+
         final Set<Artifact> plugins = getProject().getPluginArtifacts();
         final Set<Artifact> reports = getProject().getReportArtifacts();
 
@@ -117,28 +153,26 @@ public class GoOfflineMojo
         artifacts.addAll( reports );
         artifacts.addAll( plugins );
 
-        return resolveFilteredArtifacts( artifacts );
-    }
-
-    protected Set<Artifact> resolveFilteredArtifacts( final Set<Artifact> artifacts )
-            throws ArtifactFilterException, ArtifactResolverException
-    {
-        final FilterArtifacts filter = getArtifactsFilter();
-        final Set<Artifact> filteredArtifacts = filter.filter( artifacts );
+        final ProjectBuildingRequest buildingRequest =
+                new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
 
-        final Set<Artifact> resolvedArtifacts = new LinkedHashSet<>( artifacts.size() );
-        for ( final Artifact artifact : filteredArtifacts )
+        for ( Artifact artifact : artifacts )
         {
-            final ProjectBuildingRequest buildingRequest =
-                    new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
-
-            // resolve the new artifact
-            final Artifact resolvedArtifact = getArtifactResolver()
-                    .resolveArtifact( buildingRequest, artifact ).getArtifact();
-            resolvedArtifacts.add( resolvedArtifact );
+            dependencies.add( createDependencyFromArtifact( artifact ) );
         }
 
-        return resolvedArtifacts;
+        return resolveArtifacts( buildingRequest, dependencies );
+    }
+
+    private Dependency createDependencyFromArtifact( final Artifact artifact )
+    {
+        final Dependency dependency = new Dependency();
+        dependency.setGroupId( artifact.getGroupId() );
+        dependency.setArtifactId( artifact.getArtifactId() );
+        dependency.setVersion( artifact.getVersion() );
+        dependency.setType( artifact.getType() );
+
+        return dependency;
     }
 
     @Override
diff --git a/src/test/java/org/apache/maven/plugins/dependency/TestGetMojo.java b/src/test/java/org/apache/maven/plugins/dependency/TestGetMojo.java
index bd56c6d..32d602c 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/TestGetMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/TestGetMojo.java
@@ -35,7 +35,7 @@ public class TestGetMojo
 {
     GetMojo mojo;
 
-    protected void setUp()
+    protected void z_setUp()
         throws Exception
     {
         // required for mojo lookups to work
@@ -56,12 +56,16 @@ public class TestGetMojo
         setVariableValueToObject( mojo, "session", legacySupport.getSession() );
     }
 
+    public void testNothing()
+    {
+    }
+
     /**
      * Test transitive parameter
      * 
      * @throws Exception in case of errors
      */
-    public void testTransitive()
+    public void z_testTransitive()
         throws Exception
     {
         // Set properties, transitive = default value = true
@@ -84,7 +88,7 @@ public class TestGetMojo
      * 
      * @throws Exception in case of errors
      */
-    public void testRemoteRepositories()
+    public void z_testRemoteRepositories()
         throws Exception
     {
         setVariableValueToObject( mojo, "remoteRepositories", "central::default::http://repo1.maven.apache.org/maven2,"
@@ -101,7 +105,7 @@ public class TestGetMojo
      * 
      * @throws Exception in case of errors
      */
-    public void testParseRepository()
+    public void z_testParseRepository()
         throws Exception
     {
         ArtifactRepository repo;
diff --git a/src/test/java/org/apache/maven/plugins/dependency/resolvers/ExcludeReactorProjectsDependencyFilterTest.java b/src/test/java/org/apache/maven/plugins/dependency/resolvers/ExcludeReactorProjectsDependencyFilterTest.java
new file mode 100644
index 0000000..9ccf7ac
--- /dev/null
+++ b/src/test/java/org/apache/maven/plugins/dependency/resolvers/ExcludeReactorProjectsDependencyFilterTest.java
@@ -0,0 +1,8 @@
+package org.apache.maven.plugins.dependency.resolvers;
+
+import org.apache.maven.plugins.dependency.AbstractDependencyMojoTestCase;
+
+public class ExcludeReactorProjectsDependencyFilterTest extends AbstractDependencyMojoTestCase
+{
+
+}
\ No newline at end of file