From c4820aa147355b64b77eed0df37769bb1298b320 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Thu, 16 Jan 2025 17:36:46 +0100 Subject: [PATCH] Fix findResources when path ends with slash This commit fixes the `findResources` method, which failed to find resources when the resource name ended with a `/`, which is inconsistent with the Java classloader. This issue was discovered while evaluating Uno-Jar as a replacement for fatjar creation in Micronaut. --- .../unojar/JarClassLoader.java | 5 +++- .../unojar/JarClassLoaderTest.java | 25 +++++++++++++++--- .../needhamsoftware/unojar/LoggerTest.java | 4 +-- .../resources/uno-jar-examples-unojar.jar | Bin 59163 -> 59308 bytes 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/needhamsoftware/unojar/JarClassLoader.java b/core/src/main/java/com/needhamsoftware/unojar/JarClassLoader.java index 9b0a053..80b3455 100644 --- a/core/src/main/java/com/needhamsoftware/unojar/JarClassLoader.java +++ b/core/src/main/java/com/needhamsoftware/unojar/JarClassLoader.java @@ -1012,6 +1012,9 @@ protected URL findResource(String unresolvedResource) { } protected Enumeration findResources(String name) throws IOException { + if (name.length()>1 && name.endsWith("/")) { + return findResources(name.substring(0, name.length() - 1)); + } LOGGER.info("findResources(%s)", name); LOGGER.info("findResources: looking in %s", jarNames); Iterator iter = jarNames.iterator(); @@ -1141,4 +1144,4 @@ protected String findTheLibrary(String BINLIB_PREFIX, String name) { return result; } -} +} \ No newline at end of file diff --git a/core/src/test/java/com/needhamsoftware/unojar/JarClassLoaderTest.java b/core/src/test/java/com/needhamsoftware/unojar/JarClassLoaderTest.java index 7459d4b..906126d 100644 --- a/core/src/test/java/com/needhamsoftware/unojar/JarClassLoaderTest.java +++ b/core/src/test/java/com/needhamsoftware/unojar/JarClassLoaderTest.java @@ -6,6 +6,9 @@ import org.junit.Before; import org.junit.Test; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; @@ -15,13 +18,14 @@ import static com.copyright.easiertest.EasierMocks.verify; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public class JarClassLoaderTest { - @ObjectUnderTest - private JarClassLoader object; - @Mock - private JarClassLoader jclMock; + @ObjectUnderTest + private JarClassLoader object; + @Mock + private JarClassLoader jclMock; public JarClassLoaderTest() { prepareMocks(this); @@ -71,4 +75,17 @@ public void testDelegateToExt() { // that too solves the infinite loop. replay(); } + + @Test + public void findResourcesShouldIgnoreTrailingSlash() throws IOException, URISyntaxException { + URI jarFile = this.getClass().getResource("/uno-jar-examples-unojar.jar").toURI(); + JarClassLoader loader = new JarClassLoader(this.getClass().getClassLoader(), jarFile.toURL().toExternalForm()); + // populate caches + assertNotNull(loader.load("META-INF/foo/hello.txt", null)); + replay(); + assertNotNull(loader.findResource("META-INF/foo/")); + assertNotNull(loader.findResource("META-INF/foo")); + assertTrue(loader.findResources("META-INF/foo/").hasMoreElements()); + assertTrue(loader.findResources("META-INF/foo").hasMoreElements()); + } } \ No newline at end of file diff --git a/core/src/test/java/com/needhamsoftware/unojar/LoggerTest.java b/core/src/test/java/com/needhamsoftware/unojar/LoggerTest.java index da4aeb0..482261d 100644 --- a/core/src/test/java/com/needhamsoftware/unojar/LoggerTest.java +++ b/core/src/test/java/com/needhamsoftware/unojar/LoggerTest.java @@ -49,6 +49,6 @@ public void testOutput() throws IOException, InterruptedException { System.out.println("Error:"+error); System.out.println("Exit:"+start.exitValue()); assertEquals(2,bootInfoCount.get()); - assertEquals(88,jclDebugCount.get()); + assertEquals(94,jclDebugCount.get()); } -} +} \ No newline at end of file diff --git a/core/src/test/resources/uno-jar-examples-unojar.jar b/core/src/test/resources/uno-jar-examples-unojar.jar index 1a6be4b0f6bf7e74a517328c1c61bfba7dfadeb2..a30a8747d941ed94b32fa1d10417464335fa9e29 100644 GIT binary patch delta 3192 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