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();