From ae7ed05ad5d45adc2c32a37fb6b9bb800fe51bd3 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Wed, 2 Feb 2022 20:03:39 +0800 Subject: [PATCH] bugfix manifest retrieval is unreliable when multiple manifests files are on the classpath --- .../java/net/woggioni/envelope/Launcher.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/launcher/src/main/java/net/woggioni/envelope/Launcher.java b/launcher/src/main/java/net/woggioni/envelope/Launcher.java index 3b49922..ff40601 100644 --- a/launcher/src/main/java/net/woggioni/envelope/Launcher.java +++ b/launcher/src/main/java/net/woggioni/envelope/Launcher.java @@ -14,6 +14,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; +import java.util.Enumeration; import java.util.List; import java.util.Objects; import java.util.function.Function; @@ -41,7 +42,20 @@ public class Launcher { @SneakyThrows public static void main(String[] args) { URI currentJar = findCurrentJar(); - URL manifestResource = Launcher.class.getResource("/" + JarFile.MANIFEST_NAME); + String currentJarPath = currentJar.getPath(); + URL manifestResource = null; + Enumeration enumeration = Launcher.class.getClassLoader().getResources(JarFile.MANIFEST_NAME); + while(enumeration.hasMoreElements()) { + URL candidate = enumeration.nextElement(); + URL subUrl = new URL(candidate.getFile()); + String candidatePath = subUrl.getPath(); + int i = candidatePath.indexOf("!/"); + candidatePath = candidatePath.substring(0, i); + if(Objects.equals(currentJarPath, candidatePath)) { + manifestResource = candidate; + break; + } + } if(Objects.isNull(manifestResource)) { throw new RuntimeException("Launcher manifest not found"); }