From c985d307461c082961c4fe719162528f6831c0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20Rohde=20D=C3=B8ssing?= Date: Wed, 17 Apr 2019 14:55:39 +0200 Subject: [PATCH] ISSUE-326: Migrate to using Maven 3 APIs and Aether for dependency resolution --- pom.xml | 13 +- .../invoker.properties | 2 +- .../invoker.properties | 2 +- .../invoker.properties | 2 +- .../invoker.properties | 2 +- .../invoker.properties | 2 +- .../license/AbstractAddThirdPartyMojo.java | 35 +++-- .../license/AbstractDownloadLicensesMojo.java | 8 -- .../mojo/license/AbstractLicensesXmlMojo.java | 29 ++-- .../license/AbstractThirdPartyReportMojo.java | 32 +++-- .../mojo/license/AddThirdPartyMojo.java | 3 +- .../AggregateDownloadLicensesMojo.java | 4 +- .../mojo/license/DownloadLicensesMojo.java | 4 +- .../LicensesXmlInsertVersionsMojo.java | 4 +- .../license/api/DefaultThirdPartyHelper.java | 22 +-- .../license/api/DefaultThirdPartyTool.java | 135 ++++++++++-------- .../mojo/license/api/DependenciesTool.java | 48 +++++-- .../mojo/license/api/ThirdPartyTool.java | 27 ++-- .../download/LicensedArtifactResolver.java | 29 +++- 19 files changed, 247 insertions(+), 156 deletions(-) diff --git a/pom.xml b/pom.xml index 63752ddcb..d3acf1124 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,7 @@ - 2.2.1 + 3.1.0 1.7 1.3 @@ -132,6 +132,7 @@ 3.5.1 1.7.1 + 1.3.3 @@ -156,13 +157,13 @@ org.apache.maven - maven-project + maven-artifact ${mavenVersion} - org.apache.maven - maven-artifact - ${mavenVersion} + org.apache.maven.resolver + maven-resolver-api + ${maven-resolver.version} org.apache.maven @@ -255,7 +256,7 @@ org.codehaus.plexus plexus-container-default - 1.0-alpha-9-stable-1 + 2.0.0 provided diff --git a/src/it/add-third-party-excluded-included/invoker.properties b/src/it/add-third-party-excluded-included/invoker.properties index 5ebcb2576..e0b1c23e3 100644 --- a/src/it/add-third-party-excluded-included/invoker.properties +++ b/src/it/add-third-party-excluded-included/invoker.properties @@ -19,5 +19,5 @@ # . # #L% ### -invoker.goals=clean validate +invoker.goals=clean validate -e invoker.failureBehavior=fail-at-end \ No newline at end of file diff --git a/src/it/add-third-party-global-db/invoker.properties b/src/it/add-third-party-global-db/invoker.properties index 2e3f664c6..c60f39f34 100644 --- a/src/it/add-third-party-global-db/invoker.properties +++ b/src/it/add-third-party-global-db/invoker.properties @@ -19,5 +19,5 @@ # . # #L% ### -invoker.goals=clean package license:add-third-party +invoker.goals=clean package license:add-third-party -e invoker.failureBehavior=fail-fast \ No newline at end of file diff --git a/src/it/aggregate-add-third-party-global-db/invoker.properties b/src/it/aggregate-add-third-party-global-db/invoker.properties index f5a9f8010..d2e981f97 100644 --- a/src/it/aggregate-add-third-party-global-db/invoker.properties +++ b/src/it/aggregate-add-third-party-global-db/invoker.properties @@ -19,6 +19,6 @@ # . # #L% ### -invoker.goals=clean license:aggregate-add-third-party +invoker.goals=clean license:aggregate-add-third-party -e invoker.failureBehavior=fail-at-end invoker.maven.version = 3.0 + diff --git a/src/it/aggregate-add-third-party-missing-file/invoker.properties b/src/it/aggregate-add-third-party-missing-file/invoker.properties index d94c96107..6d2297dbf 100644 --- a/src/it/aggregate-add-third-party-missing-file/invoker.properties +++ b/src/it/aggregate-add-third-party-missing-file/invoker.properties @@ -19,5 +19,5 @@ # . # #L% ### -invoker.goals=clean license:aggregate-add-third-party@missing-file-only license:aggregate-add-third-party@missing-file-url-only license:aggregate-add-third-party@missing-file-both +invoker.goals=clean license:aggregate-add-third-party@missing-file-only license:aggregate-add-third-party@missing-file-url-only license:aggregate-add-third-party@missing-file-both -e invoker.failureBehavior=fail-fast \ No newline at end of file diff --git a/src/it/third-party-report-global-db/invoker.properties b/src/it/third-party-report-global-db/invoker.properties index 2aa5f872a..ef64c80c7 100644 --- a/src/it/third-party-report-global-db/invoker.properties +++ b/src/it/third-party-report-global-db/invoker.properties @@ -19,5 +19,5 @@ # . # #L% ### -invoker.goals=clean site:site +invoker.goals=clean site:site -e invoker.failureBehavior=fail-fast \ No newline at end of file diff --git a/src/main/java/org/codehaus/mojo/license/AbstractAddThirdPartyMojo.java b/src/main/java/org/codehaus/mojo/license/AbstractAddThirdPartyMojo.java index 233a2cdb7..ac1280644 100644 --- a/src/main/java/org/codehaus/mojo/license/AbstractAddThirdPartyMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AbstractAddThirdPartyMojo.java @@ -27,8 +27,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactNotFoundException; -import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; @@ -59,6 +57,9 @@ import java.util.SortedMap; import java.util.SortedSet; import org.codehaus.mojo.license.api.DependenciesToolException; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.resolution.ArtifactResolutionException; +import org.eclipse.aether.transfer.ArtifactNotFoundException; /** * Abstract mojo for all third-party mojos. @@ -592,20 +593,18 @@ public abstract class AbstractAddThirdPartyMojo @Parameter( property = "localRepository", required = true, readonly = true ) protected ArtifactRepository localRepository; - /** - * Remote repositories used for the project. - * - * @since 1.0.0 - */ - @Parameter( property = "project.remoteArtifactRepositories", required = true, readonly = true ) - protected List remoteRepositories; - /** * The set of dependencies for the current project, used to locate license databases. */ @Parameter( property = "project.artifacts", required = true, readonly = true ) protected Set dependencies; + /** + * Repository system session used by Aether. + */ + @Parameter( defaultValue = "${repositorySystemSession}", required = true, readonly = true ) + private RepositorySystemSession aetherRepoSession; + // ---------------------------------------------------------------------- // Plexus components // ---------------------------------------------------------------------- @@ -872,6 +871,17 @@ public void setExcludedLicenses( String excludedLicenses ) throws MojoExecutionE this.excludedLicenses = new ExcludedLicenses( excludedLicenses ); } + /** + * Set repo session in the components that need it. + * @param session The repository system session + */ + public void setAetherRepoSession( RepositorySystemSession session ) + { + aetherRepoSession = session; + dependenciesTool.setAetherRepoSession( aetherRepoSession ); + thirdPartyTool.setAetherRepoSession( aetherRepoSession ); + } + // ---------------------------------------------------------------------- // Protected Methods // ---------------------------------------------------------------------- @@ -881,7 +891,8 @@ protected ThirdPartyHelper getHelper() if ( helper == null ) { helper = new DefaultThirdPartyHelper( getProject(), getEncoding(), isVerbose(), dependenciesTool, - thirdPartyTool, localRepository, remoteRepositories, getLog() ); + thirdPartyTool, getProject().getRemoteArtifactRepositories(), + getProject().getRemoteProjectRepositories(), getLog() ); } return helper; } @@ -890,7 +901,7 @@ void resolveUnsafeDependenciesFromArtifact( String groupId, String artifactId, S throws ArtifactNotFoundException, IOException, ArtifactResolutionException, MojoExecutionException { File missingLicensesFromArtifact = thirdPartyTool.resolveMissingLicensesDescriptor( groupId, artifactId, - version, localRepository, remoteRepositories ); + version, getProject().getRemoteProjectRepositories() ); resolveUnsafeDependenciesFromFile( missingLicensesFromArtifact ); } diff --git a/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java index 2261b8252..2041babb2 100644 --- a/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java @@ -79,14 +79,6 @@ public abstract class AbstractDownloadLicensesMojo // Mojo Parameters // ---------------------------------------------------------------------- - /** - * Location of the local repository. - * - * @since 1.0 - */ - @Parameter( defaultValue = "${localRepository}", readonly = true ) - protected ArtifactRepository localRepository; - /** * List of Remote Repositories used by the resolver * diff --git a/src/main/java/org/codehaus/mojo/license/AbstractLicensesXmlMojo.java b/src/main/java/org/codehaus/mojo/license/AbstractLicensesXmlMojo.java index cc665bfdf..5610cd8b8 100644 --- a/src/main/java/org/codehaus/mojo/license/AbstractLicensesXmlMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AbstractLicensesXmlMojo.java @@ -40,6 +40,7 @@ import org.codehaus.mojo.license.download.LicenseSummaryWriter; import org.codehaus.mojo.license.download.LicensedArtifactResolver; import org.codehaus.mojo.license.download.ProjectLicenseInfo; +import org.eclipse.aether.RepositorySystemSession; /** * A common parent for {@link LicensesXmlInsertVersionsMojo} and {@link AbstractDownloadLicensesMojo}. @@ -83,14 +84,6 @@ public abstract class AbstractLicensesXmlMojo @Parameter( property = "licensesOutputFileEncoding", defaultValue = "${project.build.sourceEncoding}" ) private String licensesOutputFileEncoding; - /** - * Location of the local repository. - * - * @since 1.0 - */ - @Parameter( defaultValue = "${localRepository}", readonly = true ) - protected ArtifactRepository localRepository; - /** * List of Remote Repositories used by the resolver * @@ -108,12 +101,18 @@ public abstract class AbstractLicensesXmlMojo protected MavenProject project; /** - * Dependencies tool. + * Repository system session used by Aether. + */ + @Parameter( defaultValue = "${repositorySystemSession}", required = true, readonly = true ) + private RepositorySystemSession aetherRepoSession; + + /** + * Licensed artifact resolver. * * @since 1.0 */ @Component - protected LicensedArtifactResolver dependenciesTool; + protected LicensedArtifactResolver licensedArtifactResolver; private Charset charset; @@ -184,4 +183,14 @@ protected void writeLicenseSummary( List deps, File licenses writeVersions ); } + /** + * Set repo session in the components that need it. + * @param session The repository system session + */ + public void setAetherRepoSession( RepositorySystemSession session ) + { + aetherRepoSession = session; + licensedArtifactResolver.setAetherRepoSession( aetherRepoSession ); + } + } diff --git a/src/main/java/org/codehaus/mojo/license/AbstractThirdPartyReportMojo.java b/src/main/java/org/codehaus/mojo/license/AbstractThirdPartyReportMojo.java index 85fa6dfae..e80dd0b11 100644 --- a/src/main/java/org/codehaus/mojo/license/AbstractThirdPartyReportMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AbstractThirdPartyReportMojo.java @@ -23,7 +23,6 @@ */ import org.apache.commons.collections.CollectionUtils; -import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.doxia.siterenderer.Renderer; @@ -64,6 +63,7 @@ import java.util.SortedSet; import java.util.TreeSet; import org.codehaus.mojo.license.api.ResolvedProjectDependencies; +import org.eclipse.aether.RepositorySystemSession; /** * Base class for third-party reports. @@ -301,14 +301,6 @@ public abstract class AbstractThirdPartyReportMojo extends AbstractMavenReport @Parameter( property = "license.encoding", defaultValue = "${project.build.sourceEncoding}" ) private String encoding; - /** - * Local Repository. - * - * @since 1.1 - */ - @Parameter( property = "localRepository", required = true, readonly = true ) - private ArtifactRepository localRepository; - /** * The Maven Project. * @@ -353,6 +345,12 @@ public abstract class AbstractThirdPartyReportMojo extends AbstractMavenReport @Component private ThirdPartyTool thirdPartyTool; + /** + * Repository system session used by Aether. + */ + @Parameter( defaultValue = "${repositorySystemSession}", required = true, readonly = true ) + private RepositorySystemSession aetherRepoSession; + /** * A URL returning a plain text file that contains include/exclude artifact filters in the following format: *
@@ -437,10 +435,6 @@ protected void executeReport( Locale locale )
         {
             throw new MavenReportException( e.getMessage(), e );
         }
-        catch ( InvalidDependencyVersionException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
-        }
         catch ( ArtifactNotFoundException e )
         {
             throw new MavenReportException( e.getMessage(), e );
@@ -577,7 +571,7 @@ Collection createThirdPartyDetails( MavenProject project, boo
         ThirdPartyHelper thirdPartyHelper =
                 new DefaultThirdPartyHelper( project, encoding, verbose,
                         dependenciesTool, thirdPartyTool,
-                        localRepository, project.getRemoteArtifactRepositories(), getLog() );
+                        project.getRemoteArtifactRepositories(), project.getRemoteProjectRepositories(), getLog() );
         // load dependencies of the project
         SortedMap projectDependencies = thirdPartyHelper.loadDependencies( this,
                 loadedDependencies );
@@ -650,5 +644,15 @@ public String getEncoding()
         return encoding;
     }
 
+    /**
+     * Set repo session in the components that need it.
+     * @param session The repository system session
+     */
+    public void setAetherRepoSession( RepositorySystemSession session )
+    {
+        aetherRepoSession = session;
+        dependenciesTool.setAetherRepoSession( aetherRepoSession );
+        thirdPartyTool.setAetherRepoSession( aetherRepoSession );
+    }
 
 }
diff --git a/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java b/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java
index 5a91acc04..388f83d75 100644
--- a/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java
+++ b/src/main/java/org/codehaus/mojo/license/AddThirdPartyMojo.java
@@ -442,8 +442,7 @@ void initFromMojo( AggregatorAddThirdPartyMojo mojo, MavenProject mavenProject,
         resolvedOverrideUrl  = mojo.resolvedOverrideUrl;
         missingLicensesFileArtifact = mojo.missingLicensesFileArtifact;
         localRepository = mojo.localRepository;
-        remoteRepositories = mavenProject.getRemoteArtifactRepositories();
-        dependencies = new HashSet<>( mavenProject.getDependencies() );
+        dependencies = new HashSet<>( mavenProject.getDependencyArtifacts() );
         licenseMerges = mojo.licenseMerges;
         licenseMergesFile = mojo.licenseMergesFile;
         includedLicenses = mojo.includedLicenses;
diff --git a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java
index 1dac80f46..66aaa9ac4 100644
--- a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java
+++ b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java
@@ -115,9 +115,9 @@ protected Map getDependencies()
 
         for ( MavenProject p : reactorProjects )
         {
-            dependenciesTool.loadProjectDependencies( new ResolvedProjectDependencies( p.getArtifacts(),
+            licensedArtifactResolver.loadProjectDependencies( new ResolvedProjectDependencies( p.getArtifacts(),
                                                                                        p.getDependencyArtifacts() ),
-                                                      this, localRepository, remoteRepositories, result );
+                                                      this, remoteRepositories, result );
         }
         return result;
     }
diff --git a/src/main/java/org/codehaus/mojo/license/DownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/DownloadLicensesMojo.java
index 0cd4cbbcc..dd75dbe86 100644
--- a/src/main/java/org/codehaus/mojo/license/DownloadLicensesMojo.java
+++ b/src/main/java/org/codehaus/mojo/license/DownloadLicensesMojo.java
@@ -86,9 +86,9 @@ protected boolean isSkip()
     protected Map getDependencies()
     {
         final Map result = new TreeMap<>();
-        dependenciesTool.loadProjectDependencies(
+        licensedArtifactResolver.loadProjectDependencies(
                 new ResolvedProjectDependencies( project.getArtifacts(), project.getDependencyArtifacts() ),
-                this, localRepository, remoteRepositories, result );
+                this, remoteRepositories, result );
         return result;
     }
 
diff --git a/src/main/java/org/codehaus/mojo/license/LicensesXmlInsertVersionsMojo.java b/src/main/java/org/codehaus/mojo/license/LicensesXmlInsertVersionsMojo.java
index b154acab7..087cbb8ef 100644
--- a/src/main/java/org/codehaus/mojo/license/LicensesXmlInsertVersionsMojo.java
+++ b/src/main/java/org/codehaus/mojo/license/LicensesXmlInsertVersionsMojo.java
@@ -137,9 +137,9 @@ public ArtifactFilters getArtifactFilters()
                 }
             };
             final Map resolvedDeps = new TreeMap();
-            dependenciesTool.loadProjectDependencies(
+            licensedArtifactResolver.loadProjectDependencies(
                     new ResolvedProjectDependencies( project.getArtifacts(), project.getDependencyArtifacts() ),
-                                                     config, localRepository, remoteRepositories, resolvedDeps );
+                                                     config, remoteRepositories, resolvedDeps );
             final Map resolvedDepsMap = new HashMap<>( resolvedDeps.size() );
             for ( LicensedArtifact dep : resolvedDeps.values() )
             {
diff --git a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java
index eb5dbb7a5..f2225b10c 100644
--- a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java
+++ b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyHelper.java
@@ -45,6 +45,7 @@
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
+import org.eclipse.aether.repository.RemoteRepository;
 
 /**
  * Default implementation of the {@link org.codehaus.mojo.license.api.ThirdPartyHelper}.
@@ -71,14 +72,14 @@ public class DefaultThirdPartyHelper
     private final ThirdPartyTool thirdPartyTool;
 
     /**
-     * Local repository used.
+     * List of remote repositories. Same as remoteRepositories, just a different API.
      */
-    private final ArtifactRepository localRepository;
+    private final List remoteRepositoriesCoreApi;
 
     /**
      * List of remote repositories.
      */
-    private final List remoteRepositories;
+    private final List remoteRepositories;
 
     /**
      * Current maven project.
@@ -113,15 +114,15 @@ public class DefaultThirdPartyHelper
      * @param verbose            Verbose flag
      * @param dependenciesTool   tool to load dependencies
      * @param thirdPartyTool     tool to load third-parties descriptors
-     * @param localRepository    maven local repository
+     * @param remoteRepositoriesCoreApi maven remote repositories, in the core api format
      * @param remoteRepositories maven remote repositories
      * @param log                logger
      */
     // CHECKSTYLE_OFF: ParameterNumber
     public DefaultThirdPartyHelper( MavenProject project, String encoding, boolean verbose,
                                     DependenciesTool dependenciesTool, ThirdPartyTool thirdPartyTool,
-                                    ArtifactRepository localRepository, List remoteRepositories,
-                                    Log log )
+                                    List remoteRepositoriesCoreApi,
+                                    List remoteRepositories, Log log )
     {
         // CHECKSTYLE_ON: ParameterNumber
         this.project = project;
@@ -129,7 +130,7 @@ public DefaultThirdPartyHelper( MavenProject project, String encoding, boolean v
         this.verbose = verbose;
         this.dependenciesTool = dependenciesTool;
         this.thirdPartyTool = thirdPartyTool;
-        this.localRepository = localRepository;
+        this.remoteRepositoriesCoreApi = remoteRepositoriesCoreApi;
         this.remoteRepositories = remoteRepositories;
         this.log = log;
         this.thirdPartyTool.setVerbose( verbose );
@@ -153,8 +154,8 @@ public SortedMap getArtifactCache()
     public SortedMap loadDependencies( MavenProjectDependenciesConfigurator configuration,
                                                              ResolvedProjectDependencies dependencyArtifacts )
     {
-        return dependenciesTool.loadProjectDependencies( dependencyArtifacts, configuration, localRepository,
-                remoteRepositories, getArtifactCache() );
+        return dependenciesTool.loadProjectDependencies( dependencyArtifacts, configuration,
+                remoteRepositoriesCoreApi, getArtifactCache() );
     }
 
     /**
@@ -167,8 +168,7 @@ public SortedProperties loadThirdPartyDescriptorForUnsafeMapping( Set
             throws ThirdPartyToolException, IOException
     {
         return thirdPartyTool.loadThirdPartyDescriptorsForUnsafeMapping( topLevelDependencies, encoding, projects,
-                                                                         unsafeDependencies, licenseMap,
-                                                                         localRepository, remoteRepositories );
+                unsafeDependencies, licenseMap, remoteRepositories );
     }
 
     /**
diff --git a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java
index 117308cdd..281eb55d4 100644
--- a/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java
+++ b/src/main/java/org/codehaus/mojo/license/api/DefaultThirdPartyTool.java
@@ -47,11 +47,6 @@
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.model.License;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
@@ -66,6 +61,14 @@
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.logging.Logger;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.artifact.DefaultArtifactType;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.transfer.ArtifactNotFoundException;
 
 /**
  * Default implementation of the third party tool.
@@ -106,16 +109,15 @@ public class DefaultThirdPartyTool
     // ----------------------------------------------------------------------
 
     /**
-     * The component that is used to resolve additional artifacts required.
+     * Maven Artifact Resolver repoSystem
      */
     @Requirement
-    private ArtifactResolver artifactResolver;
+    private org.eclipse.aether.RepositorySystem aetherRepoSystem;
 
     /**
-     * The component used for creating artifact instances.
-     */
-    @Requirement
-    private ArtifactFactory artifactFactory;
+     * Maven Artifact Resolver repoSystemSession
+    */
+    private RepositorySystemSession aetherRepoSession;
 
     /**
      * Maven ProjectHelper.
@@ -207,8 +209,7 @@ public SortedProperties loadThirdPartyDescriptorsForUnsafeMapping( Set
                                                                        Collection projects,
                                                                        SortedSet unsafeDependencies,
                                                                        LicenseMap licenseMap,
-                                                                       ArtifactRepository localRepository,
-                                                                       List remoteRepositories )
+                                                                       List remoteRepositories )
             throws ThirdPartyToolException, IOException
     {
 
@@ -230,7 +231,7 @@ public SortedProperties loadThirdPartyDescriptorsForUnsafeMapping( Set
                 break;
             }
 
-            File thirdPartyDescriptor = resolvThirdPartyDescriptor( mavenProject, localRepository, remoteRepositories );
+            File thirdPartyDescriptor = resolvThirdPartyDescriptor( mavenProject, remoteRepositories );
 
             if ( thirdPartyDescriptor != null && thirdPartyDescriptor.exists() && thirdPartyDescriptor.length() > 0 )
             {
@@ -257,7 +258,7 @@ public SortedProperties loadThirdPartyDescriptorsForUnsafeMapping( Set
         }
         try
         {
-            loadGlobalLicenses( topLevelDependencies, localRepository, remoteRepositories, unsafeDependencies,
+            loadGlobalLicenses( topLevelDependencies, remoteRepositories, unsafeDependencies,
                                 licenseMap, unsafeProjects, result );
         }
         catch ( ArtifactNotFoundException e )
@@ -304,26 +305,21 @@ private void resolveUnsafe( SortedSet unsafeDependencies, LicenseM
     /**
      * {@inheritDoc}
      */
-    public File resolvThirdPartyDescriptor( MavenProject project, ArtifactRepository localRepository,
-                                            List repositories )
+    public File resolvThirdPartyDescriptor( MavenProject project, List remoteRepositories )
             throws ThirdPartyToolException
     {
         if ( project == null )
         {
             throw new IllegalArgumentException( "The parameter 'project' can not be null" );
         }
-        if ( localRepository == null )
+        if ( remoteRepositories == null )
         {
-            throw new IllegalArgumentException( "The parameter 'localRepository' can not be null" );
-        }
-        if ( repositories == null )
-        {
-            throw new IllegalArgumentException( "The parameter 'remoteArtifactRepositories' can not be null" );
+            throw new IllegalArgumentException( "The parameter 'remoteRepositories' can not be null" );
         }
 
         try
         {
-            return resolveThirdPartyDescriptor( project, localRepository, repositories );
+            return resolveThirdPartyDescriptor( project, remoteRepositories );
         }
         catch ( ArtifactNotFoundException e )
         {
@@ -692,17 +688,17 @@ public void writeBundleThirdPartyFile( File thirdPartyFile, File outputDirectory
         FileUtil.copyFile( thirdPartyFile, bundleTarget );
     }
 
-    private void loadGlobalLicenses( Set dependencies, ArtifactRepository localRepository,
-                                     List repositories, SortedSet unsafeDependencies,
-                                     LicenseMap licenseMap, Map unsafeProjects,
-                                     SortedProperties result )
+    private void loadGlobalLicenses( Set dependencies, List remoteRepositories,
+            SortedSet unsafeDependencies,
+            LicenseMap licenseMap, Map unsafeProjects,
+            SortedProperties result )
             throws IOException, ArtifactNotFoundException, ArtifactResolutionException
     {
         for ( Artifact dep : dependencies )
         {
             if ( LICENSE_DB_TYPE.equals( dep.getType() ) )
             {
-                loadOneGlobalSet( unsafeDependencies, licenseMap, unsafeProjects, dep, localRepository, repositories,
+                loadOneGlobalSet( unsafeDependencies, licenseMap, unsafeProjects, dep, remoteRepositories,
                                   result );
             }
         }
@@ -710,12 +706,12 @@ private void loadGlobalLicenses( Set dependencies, ArtifactRepository
 
     private void loadOneGlobalSet( SortedSet unsafeDependencies, LicenseMap licenseMap,
                                    Map unsafeProjects, Artifact dep,
-                                   ArtifactRepository localRepository, List repositories,
+                                   List remoteRepositories,
                                    SortedProperties result )
             throws IOException, ArtifactNotFoundException, ArtifactResolutionException
     {
-        artifactResolver.resolve( dep, repositories, localRepository );
-        File propFile = dep.getFile();
+        File propFile = resolveArtifact( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), dep.getType(),
+                dep.getClassifier(), remoteRepositories );
         getLogger().info(
                 String.format( "Loading global license map from %s: %s", dep.toString(), propFile.getAbsolutePath() ) );
         SortedProperties props = new SortedProperties( "utf-8" );
@@ -754,15 +750,14 @@ private void loadOneGlobalSet( SortedSet unsafeDependencies, Licen
      * @throws ArtifactResolutionException if any
      * @throws ArtifactNotFoundException   if any
      */
-    private File resolveThirdPartyDescriptor( MavenProject project, ArtifactRepository localRepository,
-                                              List repositories )
+    private File resolveThirdPartyDescriptor( MavenProject project, List remoteRepositories )
             throws IOException, ArtifactResolutionException, ArtifactNotFoundException
     {
         File result;
         try
         {
             result = resolveArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(),
-                                      DESCRIPTOR_TYPE, DESCRIPTOR_CLASSIFIER, localRepository, repositories );
+                                      DESCRIPTOR_TYPE, DESCRIPTOR_CLASSIFIER, remoteRepositories );
 
             // we use zero length files to avoid re-resolution (see below)
             if ( result.length() == 0 )
@@ -770,43 +765,65 @@ private File resolveThirdPartyDescriptor( MavenProject project, ArtifactReposito
                 getLogger().debug( "Skipped third party descriptor" );
             }
         }
-        catch ( ArtifactNotFoundException e )
+        catch ( ArtifactResolutionException e )
         {
-            getLogger().debug( "Unable to locate third party files descriptor : " + e );
+            if ( e.getCause() instanceof ArtifactNotFoundException )
+            {
+                ArtifactNotFoundException artifactNotFoundException = ( ArtifactNotFoundException ) e.getCause();
+                getLogger().debug( "Unable to locate third party files descriptor : " + artifactNotFoundException );
 
-            Artifact artifact = e.getArtifact() == null
-                    ? artifactFactory.createArtifactWithClassifier(
-                    project.getGroupId(), project.getArtifactId(), project.getVersion(),
-                    DESCRIPTOR_TYPE, DESCRIPTOR_CLASSIFIER )
-                    : e.getArtifact();
+                org.eclipse.aether.artifact.Artifact artifact;
+                if ( artifactNotFoundException.getArtifact() == null )
+                {
+                    artifact = new DefaultArtifact( project.getGroupId(), project.getArtifactId(),
+                            DESCRIPTOR_CLASSIFIER, null, project.getVersion(),
+                            new DefaultArtifactType( DESCRIPTOR_TYPE ) );
+                }
+                else
+                {
+                    artifact = artifactNotFoundException.getArtifact();
+                }
 
-            // we can afford to write an empty descriptor here as we don't expect it to turn up later in the remote
-            // repository, because the parent was already released (and snapshots are updated automatically if changed)
-            result = new File( localRepository.getBasedir(), localRepository.pathOf( artifact ) );
+                /*
+                 * we can afford to write an empty descriptor here
+                 * as we don't expect it to turn up later in the remote
+                 * repository, because the parent was already released
+                 * (and snapshots are updated automatically if changed)
+                 */
+                result = new File( aetherRepoSession.getLocalRepository().getBasedir(),
+                        aetherRepoSession.getLocalRepositoryManager().getPathForLocalArtifact( artifact ) );
+            }
+            else
+            {
+                throw e;
+            }
         }
 
         return result;
     }
 
     public File resolveMissingLicensesDescriptor( String groupId, String artifactId, String version,
-            ArtifactRepository localRepository, List repositories )
+            List remoteRepositories )
             throws IOException, ArtifactResolutionException, ArtifactNotFoundException
     {
-        return resolveArtifact( groupId, artifactId, version, DESCRIPTOR_TYPE, DESCRIPTOR_CLASSIFIER, localRepository,
-                repositories );
+        return resolveArtifact( groupId, artifactId, version, DESCRIPTOR_TYPE,
+                DESCRIPTOR_CLASSIFIER, remoteRepositories );
     }
 
     private File resolveArtifact( String groupId, String artifactId, String version,
-            String type, String classifier, ArtifactRepository localRepository, List repositories )
-                    throws ArtifactResolutionException, IOException, ArtifactNotFoundException
+            String type, String classifier, List remoteRepositories )
+                    throws ArtifactResolutionException
     {
         // TODO: this is a bit crude - proper type, or proper handling as metadata rather than an artifact in 2.1?
-        Artifact artifact = artifactFactory.createArtifactWithClassifier( groupId, artifactId, version, type,
-                                                                          classifier );
-
-        artifactResolver.resolve( artifact, repositories, localRepository );
-
-        return artifact.getFile();
+        org.eclipse.aether.artifact.Artifact artifact2
+                = new DefaultArtifact( groupId, artifactId, classifier, null,
+                        version, new DefaultArtifactType( type ) );
+        ArtifactRequest artifactRequest = new ArtifactRequest()
+                .setArtifact( artifact2 )
+                .setRepositories( remoteRepositories );
+        ArtifactResult result = aetherRepoSystem.resolveArtifact( aetherRepoSession, artifactRequest );
+
+        return result.getArtifact().getFile();
     }
 
     private Map migrateMissingFileKeys( Set missingFileKeys )
@@ -837,4 +854,10 @@ private Map migrateMissingFileKeys( Set missingFileKeys
         }
         return migrateKeys;
     }
+
+    @Override
+    public void setAetherRepoSession( RepositorySystemSession aetherRepoSession )
+    {
+        this.aetherRepoSession = aetherRepoSession;
+    }
 }
diff --git a/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java b/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java
index 575053b4f..a81fb8fe1 100644
--- a/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java
+++ b/src/main/java/org/codehaus/mojo/license/api/DependenciesTool.java
@@ -23,9 +23,7 @@
  */
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.ProjectBuildingException;
 import org.codehaus.mojo.license.utils.MojoHelper;
 import org.codehaus.plexus.component.annotations.Component;
@@ -36,9 +34,16 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.project.ProjectBuilder;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.eclipse.aether.RepositorySystemSession;
 
 /**
  * A tool to deal with dependencies of a project.
@@ -61,7 +66,12 @@ public class DependenciesTool
      * Project builder.
      */
     @Requirement
-    private MavenProjectBuilder mavenProjectBuilder;
+    private ProjectBuilder mavenProjectBuilder;
+
+    /**
+     * Maven Artifact Resolver repoSystemSession
+    */
+    private RepositorySystemSession aetherRepoSession;
 
     // CHECKSTYLE_OFF: MethodLength
     /**
@@ -70,17 +80,15 @@ public class DependenciesTool
      *
      * Result is given in a map where keys are unique artifact id
      *
-     * @param dependencies       the project dependencies
+     * @param artifacts       the project dependencies
      * @param configuration      the configuration
-     * @param localRepository    local repository used to resolv dependencies
-     * @param remoteRepositories remote repositories used to resolv dependencies
+     * @param remoteRepositories remote repositories used to resolve dependencies
      * @param cache              a optional cache where to keep resolved dependencies
      * @return the map of resolved dependencies indexed by their unique id.
      * @see MavenProjectDependenciesConfigurator
      */
     public SortedMap loadProjectDependencies( ResolvedProjectDependencies artifacts,
                                                                     MavenProjectDependenciesConfigurator configuration,
-                                                                    ArtifactRepository localRepository,
                                                                     List remoteRepositories,
                                                                     SortedMap cache )
     {
@@ -163,8 +171,25 @@ public SortedMap loadProjectDependencies( ResolvedProjectD
 
                 try
                 {
-                    depMavenProject =
-                        mavenProjectBuilder.buildFromRepository( artifact, remoteRepositories, localRepository, true );
+                    /*
+                     * Some POMs may refer to e.g. java.home or java.version,
+                     * so we need to ensure common system properties are set when parsing POMs.
+                     * Using the current system properties seems like a decent solution.
+                     */
+                    Properties props = new Properties();
+                    props.putAll( System.getProperties() );
+                    ProjectBuildingRequest req = new DefaultProjectBuildingRequest()
+                            .setRepositorySession( aetherRepoSession )
+                            .setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL )
+                            //We already have the relevant part of the dependency tree
+                            //Re-resolving risks including e.g. excluded artifacts
+                            .setResolveDependencies( false )
+                            //We don't care about plugin licensing
+                            .setProcessPlugins( false )
+                            .setSystemProperties( props )
+                            .setRemoteRepositories( remoteRepositories );
+                    depMavenProject
+                            = mavenProjectBuilder.build( artifact, true, req ).getProject();
                     depMavenProject.getArtifact().setScope( artifact.getScope() );
 
                     // In case maven-metadata.xml has different artifactId, groupId or version.
@@ -239,4 +264,9 @@ public SortedMap loadProjectDependencies( ResolvedProjectD
         return result;
     }
     // CHECKSTYLE_ON: MethodLength
+
+    public void setAetherRepoSession( RepositorySystemSession aetherRepoSession )
+    {
+        this.aetherRepoSession = aetherRepoSession;
+    }
 }
diff --git a/src/main/java/org/codehaus/mojo/license/api/ThirdPartyTool.java b/src/main/java/org/codehaus/mojo/license/api/ThirdPartyTool.java
index 0731580c2..5387e5090 100644
--- a/src/main/java/org/codehaus/mojo/license/api/ThirdPartyTool.java
+++ b/src/main/java/org/codehaus/mojo/license/api/ThirdPartyTool.java
@@ -23,9 +23,6 @@
  */
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.model.License;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
@@ -39,6 +36,10 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.transfer.ArtifactNotFoundException;
 
 /**
  * A tool to load third party files missing files.
@@ -81,7 +82,6 @@ public interface ThirdPartyTool
      * @param projects           all projects where to read third parties descriptors
      * @param unsafeProjects     all unsafe projects
      * @param licenseMap         license map where to store new licenses
-     * @param localRepository    local repository
      * @param remoteRepositories remote repositories
      * @return the map of loaded missing from the remote missing third party files
      * @throws ThirdPartyToolException if any
@@ -91,8 +91,7 @@ SortedProperties loadThirdPartyDescriptorsForUnsafeMapping( Set depend
                                                                 Collection projects,
                                                                 SortedSet unsafeProjects,
                                                                 LicenseMap licenseMap,
-                                                                ArtifactRepository localRepository,
-                                                                List remoteRepositories )
+                                                                List remoteRepositories )
             throws ThirdPartyToolException, IOException;
 
     /**
@@ -108,20 +107,18 @@ SortedProperties loadThirdPartyDescriptorsForUnsafeMapping( Set depend
     /**
      * Obtain the third party file from the repository.
      * 

- * Will first search in the local repository, then into the remote repositories and will resolv it. + * Will first search in the local repository, then into the remote repositories and will resolve it. * * @param project the project - * @param localRepository the local repository - * @param repositories the remote repositories + * @param remoteRepositories the remote repositories * @return the locale file resolved into the local repository * @throws ThirdPartyToolException if any */ - File resolvThirdPartyDescriptor( MavenProject project, ArtifactRepository localRepository, - List repositories ) + File resolvThirdPartyDescriptor( MavenProject project, List remoteRepositories ) throws ThirdPartyToolException; File resolveMissingLicensesDescriptor( String groupId, String artifactId, String version, - ArtifactRepository localRepository, List repositories ) + List remoteRepositories ) throws IOException, ArtifactResolutionException, ArtifactNotFoundException; /** @@ -226,4 +223,10 @@ void writeThirdPartyFile( LicenseMap licenseMap, File thirdPartyFile, boolean ve */ void writeBundleThirdPartyFile( File thirdPartyFile, File outputDirectory, String bundleThirdPartyPath ) throws IOException; + + /** + * Sets the repo session the tool will use. + * @param aetherRepoSession The repo session + */ + void setAetherRepoSession( RepositorySystemSession aetherRepoSession ); } diff --git a/src/main/java/org/codehaus/mojo/license/download/LicensedArtifactResolver.java b/src/main/java/org/codehaus/mojo/license/download/LicensedArtifactResolver.java index 3c15392e3..fc69ae5df 100644 --- a/src/main/java/org/codehaus/mojo/license/download/LicensedArtifactResolver.java +++ b/src/main/java/org/codehaus/mojo/license/download/LicensedArtifactResolver.java @@ -25,13 +25,17 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.ProjectBuilder; import org.apache.maven.project.ProjectBuildingException; +import org.apache.maven.project.ProjectBuildingRequest; import org.codehaus.mojo.license.api.ArtifactFilters; import org.codehaus.mojo.license.api.DefaultThirdPartyTool; import org.codehaus.mojo.license.api.MavenProjectDependenciesConfigurator; @@ -41,6 +45,7 @@ import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.logging.Logger; +import org.eclipse.aether.RepositorySystemSession; /** * A tool to deal with dependencies of a project. @@ -63,7 +68,9 @@ public class LicensedArtifactResolver * Project builder. */ @Requirement - private MavenProjectBuilder mavenProjectBuilder; + private ProjectBuilder mavenProjectBuilder; + + private RepositorySystemSession aetherRepoSession; // CHECKSTYLE_OFF: MethodLength /** @@ -80,7 +87,6 @@ public class LicensedArtifactResolver */ public void loadProjectDependencies( ResolvedProjectDependencies artifacts, MavenProjectDependenciesConfigurator configuration, - ArtifactRepository localRepository, List remoteRepositories, Map result ) { @@ -154,8 +160,17 @@ public void loadProjectDependencies( ResolvedProjectDependencies artifacts, LicensedArtifact.builder( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() ); try { - final MavenProject project = - mavenProjectBuilder.buildFromRepository( artifact, remoteRepositories, localRepository, true ); + Properties props = new Properties(); + props.putAll( System.getProperties() ); + ProjectBuildingRequest req = new DefaultProjectBuildingRequest() + .setRemoteRepositories( remoteRepositories ) + .setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL ) + .setResolveDependencies( false ) + .setProcessPlugins( false ) + .setSystemProperties( props ) + .setRepositorySession( aetherRepoSession ); + + final MavenProject project = mavenProjectBuilder.build( artifact, true, req ).getProject(); @SuppressWarnings( "unchecked" ) List lics = project.getLicenses(); if ( lics != null ) @@ -216,4 +231,8 @@ public void loadProjectDependencies( ResolvedProjectDependencies artifacts, } // CHECKSTYLE_ON: MethodLength + public void setAetherRepoSession( RepositorySystemSession aetherRepoSession ) + { + this.aetherRepoSession = aetherRepoSession; + } }