You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/03/31 09:42:12 UTC
(maven) 01/01: fix: propagate addResource() to model Build for Maven 3 compat
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch lake-muscle
in repository https://gitbox.apache.org/repos/asf/maven.git
commit aafa1325f2a8786cc0dcf794993b5263043b6a7d
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Tue Mar 31 11:41:57 2026 +0200
fix: propagate addResource() to model Build for Maven 3 compat
When a Maven 3 plugin dynamically adds a resource via
project.addResource() or project.getResources().add(), the resource
was only added to the internal sources set but not to the model's
Build.resources. This caused project.getBuild().getResources() to be
out of sync with project.getResources(), breaking plugins like
maven-source-plugin that access resources through the Build model.
Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
.../org/apache/maven/project/MavenProject.java | 7 +++
.../apache/maven/project/ResourceIncludeTest.java | 58 ++++++++++++++++++++++
2 files changed, 65 insertions(+)
diff --git a/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java b/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
index 45731697a7..72a81e64a4 100644
--- a/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
+++ b/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
@@ -838,6 +838,13 @@ private Resource toConnectedResource(SourceRoot sourceRoot, ProjectScope scope)
private void addResource(ProjectScope scope, Resource resource) {
addSourceRoot(new DefaultSourceRoot(getBaseDirectory(), scope, resource.getDelegate()));
+ // Also update the model's Build to maintain compatibility with code that
+ // accesses resources via project.getBuild().getResources()
+ if (scope == ProjectScope.MAIN) {
+ getModelBuild().addResource(resource);
+ } else {
+ getModelBuild().addTestResource(resource);
+ }
}
/**
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ResourceIncludeTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/ResourceIncludeTest.java
index 519dbd5770..57ad0dbfc8 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ResourceIncludeTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ResourceIncludeTest.java
@@ -281,4 +281,62 @@ void testTargetPathEdgeCases() {
placeholderResult.getTargetPath(),
"Property placeholder in targetPath should be preserved");
}
+
+ /**
+ * Verifies that resources added via {@code project.addResource()} or
+ * {@code project.getResources().add()} are visible through both
+ * {@code project.getResources()} and {@code project.getBuild().getResources()}.
+ * This is important for Maven 3 compatibility, since plugins may access
+ * resources through either path.
+ *
+ * @see <a href="https://github.com/apache/maven-source-plugin/pull/281">maven-source-plugin#281</a>
+ */
+ @Test
+ void testAddResourceVisibleViaBuildGetResources() {
+ // Initial state: one resource in sources, none added dynamically
+ assertEquals(1, project.getResources().size());
+ int initialBuildResources = project.getBuild().getResources().size();
+
+ // Add a resource dynamically (simulating what maven-remote-resources-plugin does)
+ Resource dynamicResource = new Resource();
+ dynamicResource.setDirectory("target/maven-shared-archive-resources");
+ project.addResource(dynamicResource);
+
+ // Verify visible via project.getResources()
+ List<Resource> projectResources = project.getResources();
+ assertEquals(2, projectResources.size(), "Dynamic resource should be visible via project.getResources()");
+
+ // Verify ALSO visible via project.getBuild().getResources()
+ List<Resource> buildResources = project.getBuild().getResources();
+ assertEquals(
+ initialBuildResources + 1,
+ buildResources.size(),
+ "Dynamic resource should also be visible via project.getBuild().getResources()");
+
+ boolean found =
+ buildResources.stream().anyMatch(r -> r.getDirectory().contains("maven-shared-archive-resources"));
+ assertTrue(found, "getBuild().getResources() should contain the dynamically added resource");
+ }
+
+ /**
+ * Same as above but using {@code project.getResources().add()} path.
+ */
+ @Test
+ void testAddResourceViaListVisibleViaBuildGetResources() {
+ int initialBuildResources = project.getBuild().getResources().size();
+
+ Resource dynamicResource = new Resource();
+ dynamicResource.setDirectory("target/maven-shared-archive-resources");
+ project.getResources().add(dynamicResource);
+
+ List<Resource> buildResources = project.getBuild().getResources();
+ assertEquals(
+ initialBuildResources + 1,
+ buildResources.size(),
+ "Resource added via getResources().add() should be visible via getBuild().getResources()");
+
+ boolean found =
+ buildResources.stream().anyMatch(r -> r.getDirectory().contains("maven-shared-archive-resources"));
+ assertTrue(found, "getBuild().getResources() should contain the resource added via getResources().add()");
+ }
}