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

slachiewicz pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/maven-remote-resources-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new 2bbd10a  Reuse reactor projects in getProjects() instead of rebuilding 
their models (#270) (#307)
2bbd10a is described below

commit 2bbd10a122220cb788283ddb60b60342e6fb4308
Author: Efe <[email protected]>
AuthorDate: Wed Oct 28 19:14:41 2026 +0300

    Reuse reactor projects in getProjects() instead of rebuilding their models 
(#270) (#307)
    
    Artifacts that belong to the reactor now use the live MavenProject from the 
session; only the other dependencies are built with the ProjectBuilder.
    
    Co-authored-by: Efe Gökdemir <[email protected]>
---
 .../remote/AbstractProcessRemoteResourcesMojo.java |  74 +++++++++----
 .../resources/remote/RemoteResourcesMojoTest.java  | 114 +++++++++++++++++++++
 2 files changed, 166 insertions(+), 22 deletions(-)

diff --git 
a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java
 
b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java
index 4a04bd7..b4e4c96 100644
--- 
a/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java
+++ 
b/src/main/java/org/apache/maven/plugin/resources/remote/AbstractProcessRemoteResourcesMojo.java
@@ -581,45 +581,75 @@ public abstract class AbstractProcessRemoteResourcesMojo 
extends AbstractMojo {
                 artifact = snapshotArtifact;
             }
 
-            getLog().debug("Building project for " + artifact);
-            MavenProject p;
-            try {
-                ProjectBuildingRequest req = new 
DefaultProjectBuildingRequest()
-                        
.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL)
-                        .setProcessPlugins(false)
-                        
.setRepositorySession(mavenSession.getRepositorySession())
-                        
.setSystemProperties(mavenSession.getSystemProperties())
-                        .setUserProperties(mavenSession.getUserProperties())
-                        .setLocalRepository(mavenSession.getLocalRepository())
-                        
.setRemoteRepositories(project.getRemoteArtifactRepositories());
-                ProjectBuildingResult res = projectBuilder.build(artifact, 
req);
-                p = res.getProject();
-            } catch (ProjectBuildingException e) {
-                getLog().warn("Invalid project model for artifact [" + 
artifact.getGroupId() + ":"
-                        + artifact.getArtifactId() + ":" + 
artifact.getVersion() + "]. "
-                        + "It will be ignored by the remote resources Mojo.");
-                continue;
+            MavenProject reactorProject = findReactorProject(artifact, 
mavenSession);
+            if (reactorProject == null) {
+
+                getLog().debug("Building project for " + artifact);
+                try {
+                    ProjectBuildingRequest projectBuildingRequest = new 
DefaultProjectBuildingRequest()
+                            
.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL)
+                            .setProcessPlugins(false)
+                            
.setRepositorySession(mavenSession.getRepositorySession())
+                            
.setSystemProperties(mavenSession.getSystemProperties())
+                            
.setUserProperties(mavenSession.getUserProperties())
+                            
.setLocalRepository(mavenSession.getLocalRepository())
+                            
.setRemoteRepositories(project.getRemoteArtifactRepositories());
+                    ProjectBuildingResult buildingResult = 
projectBuilder.build(artifact, projectBuildingRequest);
+                    reactorProject = buildingResult.getProject();
+                } catch (ProjectBuildingException e) {
+                    getLog().warn("Invalid project model for artifact [" + 
artifact.getGroupId() + ":"
+                            + artifact.getArtifactId() + ":" + 
artifact.getVersion() + "]. "
+                            + "It will be ignored by the remote resources 
Mojo.");
+                    continue;
+                }
             }
 
             String supplementKey = generateSupplementMapKey(
-                    p.getModel().getGroupId(), p.getModel().getArtifactId());
+                    reactorProject.getModel().getGroupId(),
+                    reactorProject.getModel().getArtifactId());
 
             if (supplementModels.containsKey(supplementKey)) {
-                Model mergedModel = mergeModels(p.getModel(), 
supplementModels.get(supplementKey));
+                Model mergedModel = mergeModels(reactorProject.getModel(), 
supplementModels.get(supplementKey));
                 MavenProject mergedProject = new MavenProject(mergedModel);
                 projects.add(mergedProject);
                 mergedProject.setArtifact(artifact);
                 mergedProject.setVersion(artifact.getVersion());
                 getLog().debug("Adding project with groupId [" + 
mergedProject.getGroupId() + "] (supplemented)");
             } else {
-                projects.add(p);
-                getLog().debug("Adding project with groupId [" + 
p.getGroupId() + "]");
+                projects.add(reactorProject);
+                getLog().debug("Adding project with groupId [" + 
reactorProject.getGroupId() + "]");
             }
         }
         projects.sort(new ProjectComparator());
         return projects;
     }
 
+    private static MavenProject findReactorProject(Artifact artifact, 
MavenSession session) {
+        if (session == null) {
+            return null;
+        }
+        return findReactorProject(artifact, session.getProjects());
+    }
+
+    static MavenProject findReactorProject(Artifact artifact, 
List<MavenProject> reactorProjects) {
+        for (MavenProject reactorProject : reactorProjects) {
+            if (!artifact.getGroupId().equals(reactorProject.getGroupId())
+                    || 
!artifact.getArtifactId().equals(reactorProject.getArtifactId())
+                    || !artifactVersionMatches(artifact, reactorProject)) {
+                continue;
+            }
+            return reactorProject;
+        }
+        return null;
+    }
+
+    private static boolean artifactVersionMatches(Artifact artifact, 
MavenProject reactorProject) {
+        String projectVersion = reactorProject.getVersion();
+        return artifact.getVersion().equals(projectVersion)
+                || (artifact.getBaseVersion() != null
+                        && artifact.getBaseVersion().equals(projectVersion));
+    }
+
     /**
      * Returns all the transitive hull of all the involved maven projects.
      */
diff --git 
a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
 
b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
index b7c0168..c7bf20b 100644
--- 
a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
+++ 
b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
@@ -22,6 +22,9 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -33,6 +36,7 @@ import java.util.Calendar;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
@@ -52,6 +56,8 @@ import 
org.apache.maven.plugin.resources.remote.stub.MavenProjectBuildStub;
 import org.apache.maven.plugin.resources.remote.stub.MavenProjectResourcesStub;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuilder;
+import org.apache.maven.project.ProjectBuildingResult;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
@@ -95,6 +101,114 @@ public class RemoteResourcesMojoTest extends 
AbstractMojoTestCase {
         mojo.execute();
     }
 
+    public void testFindReactorProjectMatchesTimestampedSnapshot() throws 
Exception {
+        MavenProject reactorProject = new MavenProject(new 
org.apache.maven.model.Model());
+        reactorProject.setGroupId("com.example");
+        reactorProject.setArtifactId("reactor-project");
+        reactorProject.setVersion("1.0-SNAPSHOT");
+
+        Artifact artifact = new DefaultArtifact(
+                "com.example",
+                "reactor-project",
+                VersionRange.createFromVersion("1.0-20260926.120000-1"),
+                null,
+                "jar",
+                "",
+                new DefaultArtifactHandler());
+
+        assertSame(
+                reactorProject,
+                AbstractProcessRemoteResourcesMojo.findReactorProject(
+                        artifact, Collections.singletonList(reactorProject)));
+
+        Artifact externalArtifact = new DefaultArtifact(
+                "com.example",
+                "external-project",
+                VersionRange.createFromVersion("1.0"),
+                null,
+                "jar",
+                "",
+                new DefaultArtifactHandler());
+        assertNull(AbstractProcessRemoteResourcesMojo.findReactorProject(
+                externalArtifact, Collections.singletonList(reactorProject)));
+    }
+
+    public void testGetProjectsBuildsOnlyExternalArtifacts() throws Exception {
+        MavenProjectResourcesStub project = 
createTestProject("reactor-projects");
+        ProcessRemoteResourcesMojo mojo = 
lookupProcessMojoWithDefaultSettings(project);
+        setupDefaultProject(project);
+
+        MavenProject reactorProject = new MavenProject(new 
org.apache.maven.model.Model());
+        reactorProject.setGroupId("com.example");
+        reactorProject.setArtifactId("reactor-project");
+        reactorProject.setVersion("1.0-SNAPSHOT");
+
+        Artifact reactorArtifact = new DefaultArtifact(
+                "com.example",
+                "reactor-project",
+                VersionRange.createFromVersion("1.0-20260926.120000-1"),
+                "compile",
+                "jar",
+                "",
+                new DefaultArtifactHandler());
+        Artifact externalArtifact = new DefaultArtifact(
+                "com.example",
+                "external-project",
+                VersionRange.createFromVersion("1.0"),
+                "compile",
+                "jar",
+                "",
+                new DefaultArtifactHandler());
+        project.setArtifacts(new 
LinkedHashSet<>(Arrays.asList(reactorArtifact, externalArtifact)));
+        reactorProject.setArtifact(reactorArtifact);
+
+        MavenSession session = (MavenSession) getVariableValueFromObject(mojo, 
"mavenSession");
+        session.setProjects(Arrays.asList(project, reactorProject));
+
+        MavenProject externalProject = new MavenProject(new 
org.apache.maven.model.Model());
+        externalProject.setGroupId("com.example");
+        externalProject.setArtifactId("external-project");
+        externalProject.setVersion("1.0");
+        externalProject.setArtifact(externalArtifact);
+
+        ProjectBuildingResult buildingResult = (ProjectBuildingResult) 
Proxy.newProxyInstance(
+                ProjectBuildingResult.class.getClassLoader(),
+                new Class<?>[] {ProjectBuildingResult.class},
+                new InvocationHandler() {
+                    @Override
+                    public Object invoke(Object proxy, Method method, Object[] 
args) {
+                        if ("getProject".equals(method.getName())) {
+                            return externalProject;
+                        }
+                        return null;
+                    }
+                });
+        List<Artifact> builtArtifacts = new ArrayList<>();
+        ProjectBuilder projectBuilder = (ProjectBuilder) 
Proxy.newProxyInstance(
+                ProjectBuilder.class.getClassLoader(), new Class<?>[] 
{ProjectBuilder.class}, new InvocationHandler() {
+                    @Override
+                    public Object invoke(Object proxy, Method method, Object[] 
args) {
+                        if ("build".equals(method.getName())
+                                && args != null
+                                && args.length == 2
+                                && args[0] instanceof Artifact) {
+                            builtArtifacts.add((Artifact) args[0]);
+                            return buildingResult;
+                        }
+                        return null;
+                    }
+                });
+        setVariableValueToObject(mojo, "projectBuilder", projectBuilder);
+        setVariableValueToObject(mojo, "supplementModels", new HashMap<>());
+
+        List<MavenProject> projects = mojo.getProjects();
+
+        assertEquals(1, builtArtifacts.size());
+        assertSame(externalArtifact, builtArtifacts.get(0));
+        assertTrue(projects.contains(reactorProject));
+        assertTrue(projects.contains(externalProject));
+    }
+
     public void testRemoteResourceCannotEscapeOutputDirectory() throws 
Exception {
         File outputDirectory = new File("target/remote-resource-output");
         File canonicalOutputDirectory = outputDirectory.getCanonicalFile();

Reply via email to