From c50635144467f0bf99196aab2f9ed68869a0a2b9 Mon Sep 17 00:00:00 2001 From: Aayush Tiwari Date: Sun, 5 Jul 2026 20:27:03 +0530 Subject: [PATCH 1/2] Fix null context class loader handling --- .../ClasspathResourceLocatorStrategy.java | 2 +- .../ClasspathResourceLocatorStrategyTest.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java b/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java index aace0b6..a0a5562 100644 --- a/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java +++ b/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java @@ -55,7 +55,7 @@ public ClasspathResourceLocatorStrategy( public Location resolve(String locationSpecification, MessageHolder messageHolder) { ClassLoader cloader = Thread.currentThread().getContextClassLoader(); - URL resource = cloader.getResource(locationSpecification); + URL resource = cloader != null ? cloader.getResource(locationSpecification) : null; Location location = null; diff --git a/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java b/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java index fd18b0b..d4fb3ad 100644 --- a/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java +++ b/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java @@ -47,6 +47,23 @@ void shouldFailToResolveMissingClasspathResource() { assertEquals(1, mh.size()); } + @Test + void shouldFailToResolveWhenContextClassLoaderIsNull() { + Thread thread = Thread.currentThread(); + ClassLoader contextClassLoader = thread.getContextClassLoader(); + MessageHolder mh = new DefaultMessageHolder(); + + try { + thread.setContextClassLoader(null); + Location location = new ClasspathResourceLocatorStrategy().resolve("META-INF/maven/test.properties", mh); + + assertNull(location); + assertEquals(1, mh.size()); + } finally { + thread.setContextClassLoader(contextClassLoader); + } + } + @Test void shouldResolveExistingClasspathResourceWithoutPrecedingSlash() { MessageHolder mh = new DefaultMessageHolder(); From 6bb68be8aafd8b3696b25118fc42604d3e611b17 Mon Sep 17 00:00:00 2001 From: Aayush Tiwari Date: Mon, 6 Jul 2026 09:57:12 +0530 Subject: [PATCH 2/2] Use system class loader fallback --- .../io/location/ClasspathResourceLocatorStrategy.java | 4 +++- .../ClasspathResourceLocatorStrategyTest.java | 11 ++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java b/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java index a0a5562..e869f19 100644 --- a/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java +++ b/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java @@ -55,7 +55,9 @@ public ClasspathResourceLocatorStrategy( public Location resolve(String locationSpecification, MessageHolder messageHolder) { ClassLoader cloader = Thread.currentThread().getContextClassLoader(); - URL resource = cloader != null ? cloader.getResource(locationSpecification) : null; + URL resource = cloader != null + ? cloader.getResource(locationSpecification) + : ClassLoader.getSystemResource(locationSpecification); Location location = null; diff --git a/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java b/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java index d4fb3ad..6dff039 100644 --- a/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java +++ b/src/test/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategyTest.java @@ -48,17 +48,18 @@ void shouldFailToResolveMissingClasspathResource() { } @Test - void shouldFailToResolveWhenContextClassLoaderIsNull() { + void shouldResolveWithSystemClassLoaderWhenContextClassLoaderIsNull() { Thread thread = Thread.currentThread(); ClassLoader contextClassLoader = thread.getContextClassLoader(); - MessageHolder mh = new DefaultMessageHolder(); + MessageHolder messageHolder = new DefaultMessageHolder(); try { thread.setContextClassLoader(null); - Location location = new ClasspathResourceLocatorStrategy().resolve("META-INF/maven/test.properties", mh); + Location location = + new ClasspathResourceLocatorStrategy().resolve("META-INF/maven/test.properties", messageHolder); - assertNull(location); - assertEquals(1, mh.size()); + assertNotNull(location); + assertEquals(0, messageHolder.size()); } finally { thread.setContextClassLoader(contextClassLoader); }