You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sl...@apache.org on 2019/04/14 17:49:30 UTC

[maven] 01/01: [MNG-6638] - Prevent reparsing POMs in MavenMetadataSource

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

slachiewicz pushed a commit to branch MNG-6638
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 542a9f950d3111f80f0ba5823bbfe28bb500d85a
Author: Stefan Oehme <st...@gmail.com>
AuthorDate: Sun Apr 14 13:47:05 2019 +0200

    [MNG-6638] - Prevent reparsing POMs in MavenMetadataSource
    
    If a dependency on another project is found, don't parse its
    POM again, but instead use the model we already have in memory.
    
    This saves a large amount of time and memory for builds that have
    lots of subprojects and dependencies between them.
    
    The approach was directly copied from DefaultArtifactDescriptorReader,
    which does the same optimization.
---
 .../project/artifact/MavenMetadataSource.java      | 22 +++++++++++++++++++---
 .../internal/DefaultArtifactDescriptorReader.java  |  1 -
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java b/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
index 2dc9372..d89d516 100644
--- a/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
+++ b/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
@@ -56,6 +57,7 @@ import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.DistributionManagement;
 import org.apache.maven.model.Exclusion;
+import org.apache.maven.model.Model;
 import org.apache.maven.model.Relocation;
 import org.apache.maven.model.building.ModelBuildingException;
 import org.apache.maven.model.building.ModelBuildingRequest;
@@ -69,6 +71,7 @@ import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.properties.internal.EnvironmentUtils;
 import org.apache.maven.properties.internal.SystemProperties;
+import org.apache.maven.repository.internal.MavenWorkspaceReader;
 import org.apache.maven.repository.legacy.metadata.DefaultMetadataResolutionRequest;
 import org.apache.maven.repository.legacy.metadata.MetadataResolutionRequest;
 import org.codehaus.plexus.PlexusContainer;
@@ -78,6 +81,7 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupExcepti
 import org.codehaus.plexus.logging.Logger;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.RepositoryPolicy;
+import org.eclipse.aether.repository.WorkspaceReader;
 import org.eclipse.aether.transfer.ArtifactNotFoundException;
 
 /**
@@ -175,9 +179,21 @@ public class MavenMetadataSource
 
         Artifact relocatedArtifact = null;
 
-        //TODO Not even sure this is really required as the project will be cached in the builder, we'll see this
-        // is currently the biggest hotspot
-        if ( artifact instanceof ArtifactWithDependencies )
+        final WorkspaceReader workspace = legacySupport.getRepositorySession().getWorkspaceReader();
+        Model model = null;
+        if ( workspace instanceof MavenWorkspaceReader )
+        {
+            model = ( (MavenWorkspaceReader) workspace ).findModel( RepositoryUtils.toArtifact( artifact ) );
+        }
+
+        if ( model != null )
+        {
+            pomArtifact = artifact;
+            dependencies = model.getDependencies();
+            DependencyManagement dependencyManagement = model.getDependencyManagement();
+            managedDependencies = dependencyManagement == null ? null : dependencyManagement.getDependencies();
+        }
+        else if ( artifact instanceof ArtifactWithDependencies )
         {
             pomArtifact = artifact;
 
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
index 4f464ea..586c83e 100644
--- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
@@ -257,7 +257,6 @@ public class DefaultArtifactDescriptorReader
 
             Model model;
 
-            // hack: don't rebuild model if it was already loaded during reactor resolution
             final WorkspaceReader workspace = session.getWorkspaceReader();
             if ( workspace instanceof MavenWorkspaceReader )
             {