You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2026/08/05 20:27:27 UTC
(maven-antrun-plugin) branch fix-373-dependencyfilesets-aggregate created (now 00cf486)
This is an automated email from the ASF dual-hosted git repository.
elharo pushed a change to branch fix-373-dependencyfilesets-aggregate
in repository https://gitbox.apache.org/repos/asf/maven-antrun-plugin.git
at 00cf486 Assemble the aggregate dependency fileset from resolved artifact files (#373)
This branch includes the following new commits:
new 00cf486 Assemble the aggregate dependency fileset from resolved artifact files (#373)
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(maven-antrun-plugin) 01/01: Assemble the aggregate dependency fileset from resolved artifact files (#373)
Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
elharo pushed a commit to branch fix-373-dependencyfilesets-aggregate
in repository https://gitbox.apache.org/repos/asf/maven-antrun-plugin.git
commit 00cf486de1f291f8bd60148bcd1e4f02efe48894
Author: Elliotte Rusty Harold <el...@ibiblio.org>
AuthorDate: Wed Aug 5 20:27:14 2026 +0000
Assemble the aggregate dependency fileset from resolved artifact files (#373)
---
src/it/filesets-test/pom.xml | 2 +-
.../maven/ant/tasks/DependencyFilesetsTask.java | 20 +---
src/site/apt/tasks/dependencyFilesets.apt.vm | 11 +-
.../tasks/DependencyFilesetsTaskAggregateTest.java | 128 +++++++++++++++++++++
4 files changed, 140 insertions(+), 21 deletions(-)
diff --git a/src/it/filesets-test/pom.xml b/src/it/filesets-test/pom.xml
index bb3cfd3..2956758 100644
--- a/src/it/filesets-test/pom.xml
+++ b/src/it/filesets-test/pom.xml
@@ -55,7 +55,7 @@ under the License.
<mkdir dir="target/dependencies2"/>
<copy todir="target/dependencies2" flatten="true">
- <fileset refid="test.maven.project.dependencies"/>
+ <resources refid="test.maven.project.dependencies"/>
</copy>
</target>
diff --git a/src/main/java/org/apache/maven/ant/tasks/DependencyFilesetsTask.java b/src/main/java/org/apache/maven/ant/tasks/DependencyFilesetsTask.java
index 818f506..4f2e7a3 100644
--- a/src/main/java/org/apache/maven/ant/tasks/DependencyFilesetsTask.java
+++ b/src/main/java/org/apache/maven/ant/tasks/DependencyFilesetsTask.java
@@ -18,14 +18,12 @@
*/
package org.apache.maven.ant.tasks;
-import java.io.File;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.maven.ant.tasks.support.SpecificScopesArtifactFilter;
import org.apache.maven.ant.tasks.support.TypesArtifactFilter;
import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
import org.apache.maven.plugins.antrun.AntRunMojo;
import org.apache.maven.plugins.antrun.taskconfig.DependencyFilesetsConfiguration;
@@ -33,6 +31,7 @@ import org.apache.maven.project.MavenProject;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.resources.Union;
/**
* Ant task which create a fileset for each dependency in a Maven project, and a
@@ -57,30 +56,19 @@ public class DependencyFilesetsTask extends Task {
MavenProject mavenProject = this.getProject().getReference("maven.project");
- // Add filesets for depenedency artifacts
+ // Add filesets for dependency artifacts
Set<Artifact> depArtifacts = filterArtifacts(mavenProject.getArtifacts());
- FileSet dependenciesFileSet = new FileSet();
+ Union dependenciesFileSet = new Union();
dependenciesFileSet.setProject(getProject());
- ArtifactRepository localRepository = getProject().getReference("maven.local.repository");
- dependenciesFileSet.setDir(new File(localRepository.getBasedir()));
-
- if (depArtifacts.isEmpty()) {
- // For performance reasons in case of huge local repo, tell Ant to include a single thing, otherwise the
- // whole directory is scanned (even though ** is excluded).
- dependenciesFileSet.createInclude().setName(".");
- dependenciesFileSet.createExclude().setName("**");
- }
for (Artifact artifact : depArtifacts) {
- String relativeArtifactPath = localRepository.pathOf(artifact);
- dependenciesFileSet.createInclude().setName(relativeArtifactPath);
-
String fileSetName = getPrefix() + artifact.getDependencyConflictId();
FileSet singleArtifactFileSet = new FileSet();
singleArtifactFileSet.setProject(getProject());
singleArtifactFileSet.setFile(artifact.getFile());
+ dependenciesFileSet.add(singleArtifactFileSet);
getProject().addReference(fileSetName, singleArtifactFileSet);
}
diff --git a/src/site/apt/tasks/dependencyFilesets.apt.vm b/src/site/apt/tasks/dependencyFilesets.apt.vm
index 55818d7..fca7c87 100644
--- a/src/site/apt/tasks/dependencyFilesets.apt.vm
+++ b/src/site/apt/tasks/dependencyFilesets.apt.vm
@@ -35,8 +35,11 @@ DependencyFilesets Task
<<<[prefix]groupId:artifactId:[classifier]:type>>>. A junit jar dependency
gets the fileset ID <<<junit:junit:jar>>>.
- The task also creates a fileset with all the project dependencies. The
- fileset uses the default ID maven.project.dependencies.
+ The task also creates a resource collection with all the project
+ dependencies. The resource collection uses the default ID maven.project.dependencies.
+ It is assembled from the actual resolved artifact files, so artifacts located
+ outside the local repository (for example reactor inter-module dependencies)
+ are included as well.
* Task Parameters
@@ -45,7 +48,7 @@ DependencyFilesets Task
*---------------+--------------------------------------------------------+-----------------------------------*
| prefix | String to prepend to all fileset IDs | No. Defaults to empty string |
*---------------+--------------------------------------------------------+-----------------------------------*
-| projectDependenciesId | RefId for the fileset with all project dependencies | No. Defaults to maven.project.dependencies |
+| projectDependenciesId | RefId for the resource collection with all project dependencies | No. Defaults to maven.project.dependencies |
*---------------+--------------------------------------------------------+-----------------------------------*
| scopes | Comma separated list of artifact scopes to include | No. Defaults to all artifacts |
*---------------+--------------------------------------------------------+-----------------------------------*
@@ -82,7 +85,7 @@ DependencyFilesets Task
<mkdir dir="target/dependencies2"/>
<copy todir="target/dependencies2" flatten="true">
- <fileset refid="mydeps.maven.project.dependencies"/>
+ <resources refid="mydeps.maven.project.dependencies"/>
</copy>
</target>
diff --git a/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java b/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java
new file mode 100644
index 0000000..fd62b55
--- /dev/null
+++ b/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.ant.tasks;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.plugins.antrun.AntRunMojo;
+import org.apache.maven.project.MavenProject;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+
+/**
+ * Test class for the aggregate dependency fileset of {@link DependencyFilesetsTask}.
+ */
+class DependencyFilesetsTaskAggregateTest {
+
+ private static final String LOCAL_REPOSITORY_REFID = "maven.local.repository";
+
+ private static final String DEFAULT_DEPENDENCIES_REFID = "maven.project.dependencies";
+
+ @TempDir
+ Path folder;
+
+ /**
+ * The aggregate {@code maven.project.dependencies} resource collection must be assembled from the actual resolved
+ * artifact files, so that artifacts located outside the local repository (e.g. reactor inter-module dependencies)
+ * are not silently omitted.
+ *
+ * @throws IOException In case of problems
+ */
+ @Test
+ void aggregateIncludesArtifactsOutsideLocalRepository() throws IOException {
+ Path localRepositoryDir = Files.createDirectories(folder.resolve("local-repository"));
+ Path reactorDirectory = Files.createDirectories(folder.resolve("reactor-module"));
+
+ File localArtifactFile =
+ localRepositoryDir.resolve("org/example/artX/1.0/artX-1.0.jar").toFile();
+ Files.createDirectories(localArtifactFile.getParentFile().toPath());
+ Files.write(localArtifactFile.toPath(), new byte[0]);
+
+ File reactorArtifactFile = reactorDirectory.resolve("artY-1.0.jar").toFile();
+ Files.write(reactorArtifactFile.toPath(), new byte[0]);
+
+ MavenProject mavenProject = new MavenProject();
+ Set<Artifact> artifacts = new HashSet<>();
+ artifacts.add(newArtifact("org.example", "artX", localArtifactFile));
+ artifacts.add(newArtifact("com.example", "artY", reactorArtifactFile));
+ mavenProject.setArtifacts(artifacts);
+
+ Project antProject = new Project();
+ antProject.addReference(AntRunMojo.DEFAULT_MAVEN_PROJECT_REFID, mavenProject);
+ antProject.addReference(LOCAL_REPOSITORY_REFID, newRepositoryStub(localRepositoryDir));
+
+ DependencyFilesetsTask task = new DependencyFilesetsTask();
+ task.setProject(antProject);
+
+ task.execute();
+
+ ResourceCollection aggregate = (ResourceCollection) antProject.getReference(DEFAULT_DEPENDENCIES_REFID);
+ Set<File> files = new HashSet<>();
+ for (Resource resource : aggregate) {
+ files.add(((FileResource) resource).getFile());
+ }
+ assertThat(files, hasItem(localArtifactFile));
+ assertThat(files, hasItem(reactorArtifactFile));
+ }
+
+ private Artifact newArtifact(String groupId, String artifactId, File file) {
+ Artifact artifact = new DefaultArtifact(
+ groupId, artifactId, "1.0", Artifact.SCOPE_COMPILE, "jar", null, new DefaultArtifactHandler("jar"));
+ artifact.setFile(file);
+ return artifact;
+ }
+
+ private ArtifactRepository newRepositoryStub(Path basedir) {
+ InvocationHandler handler = (proxy, method, args) -> {
+ switch (method.getName()) {
+ case "pathOf":
+ return artifactPath((Artifact) args[0]);
+ case "getBasedir":
+ return basedir.toString();
+ default:
+ return null;
+ }
+ };
+ return (ArtifactRepository)
+ Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[] {ArtifactRepository.class}, handler);
+ }
+
+ private static String artifactPath(Artifact artifact) {
+ return artifact.getGroupId() + "/" + artifact.getArtifactId() + "/" + artifact.getVersion() + "/"
+ + artifact.getArtifactId() + "-" + artifact.getVersion() + "." + artifact.getType();
+ }
+}