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>-->
+<!--<!– <scope>provided</scope>–>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>org.eclipse.aether</groupId>-->
+<!-- <artifactId>aether-util</artifactId>-->
+<!-- <version>0.9.0.M2</version>-->
+<!-- <!– provided scoped dependencies aren't shaded –>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>org.eclipse.aether</groupId>-->
+<!-- <artifactId>aether-impl</artifactId>-->
+<!-- <version>0.9.0.M2</version>-->
+<!--<!– <scope>provided</scope>–>-->
+<!-- </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