From 00cf486de1f291f8bd60148bcd1e4f02efe48894 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 5 Aug 2026 20:27:14 +0000 Subject: [PATCH 1/3] Assemble the aggregate dependency fileset from resolved artifact files (#373) --- src/it/filesets-test/pom.xml | 2 +- .../ant/tasks/DependencyFilesetsTask.java | 20 +-- src/site/apt/tasks/dependencyFilesets.apt.vm | 11 +- .../DependencyFilesetsTaskAggregateTest.java | 128 ++++++++++++++++++ 4 files changed, 140 insertions(+), 21 deletions(-) create mode 100644 src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java 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. - + 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.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 void execute() { MavenProject mavenProject = this.getProject().getReference("maven.project"); - // Add filesets for depenedency artifacts + // Add filesets for dependency artifacts Set 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 <<>>. - 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 - + 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 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 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(); + } +} From 2d3670cfa065eb64e52f8415cf24326bb29f8e8d Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Thu, 6 Aug 2026 10:08:53 +0000 Subject: [PATCH 2/3] Preserve legacy dependency fileset and add resolved resources reference (#373) --- src/it/filesets-test/pom.xml | 7 +- src/it/filesets-test/verify.bsh | 15 ++++ .../ant/tasks/DependencyFilesetsTask.java | 39 +++++++++- src/main/mdo/antrun.mdo | 7 ++ src/site/apt/tasks/dependencyFilesets.apt.vm | 27 ++++--- .../DependencyFilesetsTaskAggregateTest.java | 71 +++++++++++++++---- 6 files changed, 139 insertions(+), 27 deletions(-) diff --git a/src/it/filesets-test/pom.xml b/src/it/filesets-test/pom.xml index 2956758..4ca688e 100644 --- a/src/it/filesets-test/pom.xml +++ b/src/it/filesets-test/pom.xml @@ -55,7 +55,12 @@ under the License. - + + + + + + diff --git a/src/it/filesets-test/verify.bsh b/src/it/filesets-test/verify.bsh index 82fdbb9..89422a6 100644 --- a/src/it/filesets-test/verify.bsh +++ b/src/it/filesets-test/verify.bsh @@ -55,6 +55,21 @@ try System.out.println( "Junit jar file does not exist: " + junitJar ); return false; } + + File deps3Dir = new File( basedir, "target/dependencies3" ); + antJar = new File( deps3Dir, "ant-" + scriptVarVersionAnt + ".jar" ); + junitJar = new File( deps3Dir, "junit-jupiter-api-" + scriptVarVersionJunit + ".jar" ); + + if ( ! antJar.exists() || antJar.isDirectory() ) + { + System.out.println( "Ant jar file does not exist: " + antJar ); + return false; + } + if ( ! junitJar.exists() || junitJar.isDirectory() ) + { + System.out.println( "Junit jar file does not exist: " + junitJar ); + return false; + } } catch( Throwable t ) { 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 4f2e7a3..ef168c5 100644 --- a/src/main/java/org/apache/maven/ant/tasks/DependencyFilesetsTask.java +++ b/src/main/java/org/apache/maven/ant/tasks/DependencyFilesetsTask.java @@ -18,12 +18,14 @@ */ 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; @@ -56,23 +58,39 @@ public void execute() { MavenProject mavenProject = this.getProject().getReference("maven.project"); - // Add filesets for dependency artifacts + // Add filesets for depenedency artifacts Set depArtifacts = filterArtifacts(mavenProject.getArtifacts()); - Union dependenciesFileSet = new Union(); + FileSet dependenciesFileSet = new FileSet(); 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("**"); + } + + Union dependenciesResourcesFileSet = new Union(); + dependenciesResourcesFileSet.setProject(getProject()); 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); + dependenciesResourcesFileSet.add(singleArtifactFileSet); getProject().addReference(fileSetName, singleArtifactFileSet); } getProject().addReference((getPrefix() + getProjectDependenciesId()), dependenciesFileSet); + getProject().addReference((getPrefix() + getProjectDependenciesResourcesId()), dependenciesResourcesFileSet); } /** @@ -150,6 +168,21 @@ public void setProjectDependenciesId(String projectDependenciesId) { this.configuration.setProjectDependenciesId(projectDependenciesId); } + /** + * @return RefId for the resource collection containing all project dependencies - default + * maven.project.dependencies.resources + */ + public String getProjectDependenciesResourcesId() { + return this.configuration.getProjectDependenciesResourcesId(); + } + + /** + * @param projectDependenciesResourcesId RefId for the resource collection containing all project dependencies + */ + public void setProjectDependenciesResourcesId(String projectDependenciesResourcesId) { + this.configuration.setProjectDependenciesResourcesId(projectDependenciesResourcesId); + } + /** * Filter a set of artifacts using the scopes and type filters. * diff --git a/src/main/mdo/antrun.mdo b/src/main/mdo/antrun.mdo index 4eb29c9..8e1b3a3 100644 --- a/src/main/mdo/antrun.mdo +++ b/src/main/mdo/antrun.mdo @@ -88,6 +88,13 @@ under the License. maven.project.dependencies RefId for the fileset containing all project dependencies + + projectDependenciesResourcesId + String + maven.project.dependencies.resources + RefId for the resource collection containing all project dependencies, resolved from the actual + artifact files + scopes String diff --git a/src/site/apt/tasks/dependencyFilesets.apt.vm b/src/site/apt/tasks/dependencyFilesets.apt.vm index fca7c87..ab7cc83 100644 --- a/src/site/apt/tasks/dependencyFilesets.apt.vm +++ b/src/site/apt/tasks/dependencyFilesets.apt.vm @@ -35,11 +35,15 @@ DependencyFilesets Task <<<[prefix]groupId:artifactId:[classifier]:type>>>. A junit jar dependency gets the fileset ID <<>>. - 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. + The task also creates a reference with all the project dependencies. The + reference <<>> is a fileset rooted at the local + repository. It only contains dependencies that are physically stored in the + local repository. Dependencies that are resolved from elsewhere, for example + reactor modules built in the same build, are not part of this fileset. + To include the resolved artifact files of all project dependencies, use the + <<>> reference. It is a resource + collection that contains the actual artifact file of every project dependency, + wherever it was resolved from. * Task Parameters @@ -48,7 +52,9 @@ DependencyFilesets Task *---------------+--------------------------------------------------------+-----------------------------------* | prefix | String to prepend to all fileset IDs | No. Defaults to empty string | *---------------+--------------------------------------------------------+-----------------------------------* -| projectDependenciesId | RefId for the resource collection with all project dependencies | No. Defaults to maven.project.dependencies | +| projectDependenciesId | RefId for the fileset with all project dependencies | No. Defaults to maven.project.dependencies | +*---------------+--------------------------------------------------------+-----------------------------------* +| projectDependenciesResourcesId | RefId for the resource collection with the resolved artifact files of all project dependencies | No. Defaults to maven.project.dependencies.resources | *---------------+--------------------------------------------------------+-----------------------------------* | scopes | Comma separated list of artifact scopes to include | No. Defaults to all artifacts | *---------------+--------------------------------------------------------+-----------------------------------* @@ -59,7 +65,7 @@ DependencyFilesets Task * Example This example shows how to access individual dependencies and the combined - dependency fileset. + dependency references. +---+ @@ -85,7 +91,12 @@ DependencyFilesets Task - + + + + + + diff --git a/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java b/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java index fd62b55..44640d8 100644 --- a/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java +++ b/src/test/java/org/apache/maven/ant/tasks/DependencyFilesetsTaskAggregateTest.java @@ -34,6 +34,7 @@ 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.FileSet; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.ResourceCollection; import org.apache.tools.ant.types.resources.FileResource; @@ -42,43 +43,84 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.junit.jupiter.api.Assertions.assertTrue; /** - * Test class for the aggregate dependency fileset of {@link DependencyFilesetsTask}. + * Test class for the aggregate dependency references 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"; + private static final String LEGACY_DEPENDENCIES_REFID = "maven.project.dependencies"; + + private static final String DEPENDENCIES_RESOURCES_REFID = "maven.project.dependencies.resources"; @TempDir Path folder; /** - * The aggregate {@code maven.project.dependencies} resource collection must be assembled from the actual resolved + * The {@code maven.project.dependencies.resources} 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 { + void resourcesReferenceIncludesArtifactsOutsideLocalRepository() throws IOException { + Artifact localArtifact = newArtifact("org.example", "artX"); + Artifact reactorArtifact = newArtifact("com.example", "artY"); + DependencyFilesetsTask task = executeTask(localArtifact, reactorArtifact); + + task.execute(); + + ResourceCollection resources = + (ResourceCollection) task.getProject().getReference(DEPENDENCIES_RESOURCES_REFID); + Set files = filesOf(resources); + assertThat(files, hasItem(localArtifact.getFile())); + assertThat(files, hasItem(reactorArtifact.getFile())); + } + + /** + * The legacy {@code maven.project.dependencies} reference is preserved as a fileset rooted at the local + * repository, so it only contains artifacts physically present there. + * + * @throws IOException In case of problems + */ + @Test + void legacyFilesetReferenceRemainsRootedAtLocalRepository() throws IOException { + Artifact localArtifact = newArtifact("org.example", "artX"); + Artifact reactorArtifact = newArtifact("com.example", "artY"); + DependencyFilesetsTask task = executeTask(localArtifact, reactorArtifact); + + task.execute(); + + Object reference = task.getProject().getReference(LEGACY_DEPENDENCIES_REFID); + assertTrue(reference instanceof FileSet); + Set files = filesOf((ResourceCollection) reference); + assertThat(files, hasItem(localArtifact.getFile())); + assertThat(files, not(hasItem(reactorArtifact.getFile()))); + } + + private DependencyFilesetsTask executeTask(Artifact localArtifact, Artifact reactorArtifact) 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(); + localRepositoryDir.resolve(artifactPath(localArtifact)).toFile(); Files.createDirectories(localArtifactFile.getParentFile().toPath()); Files.write(localArtifactFile.toPath(), new byte[0]); + localArtifact.setFile(localArtifactFile); File reactorArtifactFile = reactorDirectory.resolve("artY-1.0.jar").toFile(); Files.write(reactorArtifactFile.toPath(), new byte[0]); + reactorArtifact.setFile(reactorArtifactFile); MavenProject mavenProject = new MavenProject(); Set artifacts = new HashSet<>(); - artifacts.add(newArtifact("org.example", "artX", localArtifactFile)); - artifacts.add(newArtifact("com.example", "artY", reactorArtifactFile)); + artifacts.add(localArtifact); + artifacts.add(reactorArtifact); mavenProject.setArtifacts(artifacts); Project antProject = new Project(); @@ -87,22 +129,21 @@ void aggregateIncludesArtifactsOutsideLocalRepository() throws IOException { DependencyFilesetsTask task = new DependencyFilesetsTask(); task.setProject(antProject); + return task; + } - task.execute(); - - ResourceCollection aggregate = (ResourceCollection) antProject.getReference(DEFAULT_DEPENDENCIES_REFID); + private Set filesOf(ResourceCollection resources) { Set files = new HashSet<>(); - for (Resource resource : aggregate) { + for (Resource resource : resources) { files.add(((FileResource) resource).getFile()); } - assertThat(files, hasItem(localArtifactFile)); - assertThat(files, hasItem(reactorArtifactFile)); + return files; } - private Artifact newArtifact(String groupId, String artifactId, File file) { + private Artifact newArtifact(String groupId, String artifactId) throws IOException { Artifact artifact = new DefaultArtifact( groupId, artifactId, "1.0", Artifact.SCOPE_COMPILE, "jar", null, new DefaultArtifactHandler("jar")); - artifact.setFile(file); + artifact.setFile(Files.createTempFile(folder, artifactId, ".jar").toFile()); return artifact; } From ee27f074ed44be0c3010e5d759ee1ffe0c5d7817 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Thu, 6 Aug 2026 10:15:35 +0000 Subject: [PATCH 3/3] Add dedicated IT for the dependency resources reference (#373) --- .../invoker.properties | 18 +++ .../pom.xml | 123 ++++++++++++++++++ .../src/main/java/Test.java | 29 +++++ .../verify.bsh | 50 +++++++ src/it/filesets-test/pom.xml | 5 - src/it/filesets-test/verify.bsh | 15 --- 6 files changed, 220 insertions(+), 20 deletions(-) create mode 100644 src/it/dependency-filesets-resources-test/invoker.properties create mode 100644 src/it/dependency-filesets-resources-test/pom.xml create mode 100644 src/it/dependency-filesets-resources-test/src/main/java/Test.java create mode 100644 src/it/dependency-filesets-resources-test/verify.bsh diff --git a/src/it/dependency-filesets-resources-test/invoker.properties b/src/it/dependency-filesets-resources-test/invoker.properties new file mode 100644 index 0000000..f7d698e --- /dev/null +++ b/src/it/dependency-filesets-resources-test/invoker.properties @@ -0,0 +1,18 @@ +# 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. + +invoker.goals = clean generate-resources diff --git a/src/it/dependency-filesets-resources-test/pom.xml b/src/it/dependency-filesets-resources-test/pom.xml new file mode 100644 index 0000000..8c47b62 --- /dev/null +++ b/src/it/dependency-filesets-resources-test/pom.xml @@ -0,0 +1,123 @@ + + + + + + 4.0.0 + + org.apache.maven.plugins.antrun + dependency-filesets-resources-test + 1.0-SNAPSHOT + Test for the dependency resources reference of the dependencyfilesets task + Test for the dependency resources reference of the dependencyfilesets task + + + + + org.apache.maven.plugins + maven-antrun-plugin + @pom.version@ + + + antrun + generate-resources + + run + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-clean-plugin + @version.maven-clean-plugin@ + + + org.apache.maven.plugins + maven-site-plugin + @version.maven-site-plugin@ + + + + org.apache.maven.plugins + maven-resources-plugin + @version.maven-resources-plugin@ + + + org.apache.maven.plugins + maven-compiler-plugin + @version.maven-compiler-plugin@ + + + org.apache.maven.plugins + maven-surefire-plugin + @version.maven-surefire@ + + + org.apache.maven.plugins + maven-jar-plugin + @version.maven-jar-plugin@ + + + org.apache.maven.plugins + maven-install-plugin + @version.maven-install-plugin@ + + + org.apache.maven.plugins + maven-deploy-plugin + @version.maven-deploy-plugin@ + + + + + + + + org.apache.ant + ant + @version.ant@ + + + org.junit.jupiter + junit-jupiter-engine + @versions.junit5@ + + + + + diff --git a/src/it/dependency-filesets-resources-test/src/main/java/Test.java b/src/it/dependency-filesets-resources-test/src/main/java/Test.java new file mode 100644 index 0000000..7b5b646 --- /dev/null +++ b/src/it/dependency-filesets-resources-test/src/main/java/Test.java @@ -0,0 +1,29 @@ + +/* + * 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. + */ + +public class Test +{ + + public static void main( String args[] ) + { + System.out.println( "done" ); + } + +} diff --git a/src/it/dependency-filesets-resources-test/verify.bsh b/src/it/dependency-filesets-resources-test/verify.bsh new file mode 100644 index 0000000..6d2a05f --- /dev/null +++ b/src/it/dependency-filesets-resources-test/verify.bsh @@ -0,0 +1,50 @@ + +/* + * 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. + */ + +import java.io.*; +import java.util.*; +import java.util.regex.*; + +import org.codehaus.plexus.util.*; + +try +{ + File depsDir = new File( basedir, "target/dependencies" ); + File antJar = new File( depsDir, "ant-" + scriptVarVersionAnt + ".jar" ); + File junitJar = new File( depsDir, "junit-jupiter-engine-" + scriptVarVersionJunit + ".jar" ); + + if ( ! antJar.exists() || antJar.isDirectory() ) + { + System.out.println( "Ant jar file does not exist: " + antJar ); + return false; + } + if ( ! junitJar.exists() || junitJar.isDirectory() ) + { + System.out.println( "Junit jar file does not exist: " + junitJar ); + return false; + } +} +catch( Throwable t ) +{ + t.printStackTrace(); + return false; +} + +return true; diff --git a/src/it/filesets-test/pom.xml b/src/it/filesets-test/pom.xml index 4ca688e..bb3cfd3 100644 --- a/src/it/filesets-test/pom.xml +++ b/src/it/filesets-test/pom.xml @@ -58,11 +58,6 @@ under the License. - - - - - diff --git a/src/it/filesets-test/verify.bsh b/src/it/filesets-test/verify.bsh index 89422a6..82fdbb9 100644 --- a/src/it/filesets-test/verify.bsh +++ b/src/it/filesets-test/verify.bsh @@ -55,21 +55,6 @@ try System.out.println( "Junit jar file does not exist: " + junitJar ); return false; } - - File deps3Dir = new File( basedir, "target/dependencies3" ); - antJar = new File( deps3Dir, "ant-" + scriptVarVersionAnt + ".jar" ); - junitJar = new File( deps3Dir, "junit-jupiter-api-" + scriptVarVersionJunit + ".jar" ); - - if ( ! antJar.exists() || antJar.isDirectory() ) - { - System.out.println( "Ant jar file does not exist: " + antJar ); - return false; - } - if ( ! junitJar.exists() || junitJar.isDirectory() ) - { - System.out.println( "Junit jar file does not exist: " + junitJar ); - return false; - } } catch( Throwable t ) {