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/02 12:25:17 UTC

(maven-remote-resources-plugin) 01/01: Close the remote resources classloader after execution (#273)

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

elharo pushed a commit to branch fix/issue-273-close-classloader
in repository https://gitbox.apache.org/repos/asf/maven-remote-resources-plugin.git

commit 466018cf62b9c6a95bebcef409d87a47105be6e6
Author: Elliotte Rusty Harold <el...@ibiblio.org>
AuthorDate: Sun Aug 2 12:25:07 2026 +0000

    Close the remote resources classloader after execution (#273)
---
 .../remote/AbstractProcessRemoteResourcesMojo.java | 13 +++++++++++--
 .../resources/remote/RemoteResourcesMojoTest.java  | 22 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 2 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 f57f6d1..177d353 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
@@ -369,6 +369,8 @@ public abstract class AbstractProcessRemoteResourcesMojo extends AbstractMojo {
 
     private VelocityEngine velocity;
 
+    private RemoteResourcesClassLoader classLoader;
+
     protected final RepositorySystem repoSystem;
 
     /**
@@ -435,7 +437,7 @@ public abstract class AbstractProcessRemoteResourcesMojo extends AbstractMojo {
             List<File> resourceBundleArtifacts = downloadBundles(resourceBundles);
             supplementModels = loadSupplements(supplementalModels);
 
-            ClassLoader classLoader = initalizeClassloader(resourceBundleArtifacts);
+            classLoader = initalizeClassloader(resourceBundleArtifacts);
 
             Thread.currentThread().setContextClassLoader(classLoader);
 
@@ -476,6 +478,13 @@ public abstract class AbstractProcessRemoteResourcesMojo extends AbstractMojo {
             }
         } finally {
             Thread.currentThread().setContextClassLoader(origLoader);
+            if (classLoader != null) {
+                try {
+                    classLoader.close();
+                } catch (IOException e) {
+                    getLog().debug("Error closing remote resources classloader: " + e.getMessage(), e);
+                }
+            }
         }
     }
 
@@ -862,7 +871,7 @@ public abstract class AbstractProcessRemoteResourcesMojo extends AbstractMojo {
         return bundleArtifacts;
     }
 
-    private ClassLoader initalizeClassloader(List<File> artifacts) throws MojoExecutionException {
+    private RemoteResourcesClassLoader initalizeClassloader(List<File> artifacts) throws MojoExecutionException {
         RemoteResourcesClassLoader cl = new RemoteResourcesClassLoader(null);
         try {
             for (File artifact : artifacts) {
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 583732b..00cc5c6 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
@@ -165,6 +165,28 @@ public class RemoteResourcesMojoTest extends AbstractMojoTestCase {
         assertTrue(file.exists());
     }
 
+    public void testClassLoaderIsClosedAfterExecution() throws Exception {
+        final MavenProjectResourcesStub project = createTestProject("default-closeclassloader");
+        final ProcessRemoteResourcesMojo mojo = lookupProcessMojoWithSettings(project, new String[] {"test:test:1.0"});
+
+        setupDefaultProject(project);
+
+        String path = pathOf(new DefaultArtifact(
+                "test", "test", VersionRange.createFromVersion("1.0"), null, "jar", "", new DefaultArtifactHandler()));
+
+        File file = new File(path);
+        file.getParentFile().mkdirs();
+        buildResourceBundle("default-closeclassloader-create", null, new String[] {"SIMPLE.txt"}, file);
+
+        mojo.execute();
+
+        RemoteResourcesClassLoader classLoader =
+                (RemoteResourcesClassLoader) getVariableValueFromObject(mojo, "classLoader");
+        assertNotNull(classLoader);
+        // resources from the bundle jars must no longer be served by the closed classloader
+        assertNull(classLoader.getResource("SIMPLE.txt"));
+    }
+
     public void testVelocityUTF8() throws Exception {
         final MavenProjectResourcesStub project = createTestProject("default-utf8");
         final ProcessRemoteResourcesMojo mojo = lookupProcessMojoWithSettings(project, new String[] {"test:test:1.2"});