diff --git a/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/util/SortedJarOrPathList.java b/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/util/SortedJarOrPathList.java index 93594ca..d26205a 100644 --- a/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/util/SortedJarOrPathList.java +++ b/stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/util/SortedJarOrPathList.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; @@ -30,7 +31,7 @@ public class SortedJarOrPathList extends ArrayList { private static final Logger LOGGER = LogManager.getLogger(); private static final ArtifactVersion FALLBACK_VERSION = new DefaultArtifactVersion("1"); private static Function jarGetter; - private Function metadataGetter; + private final Map, Function> metadataGetters = new HashMap<>(); private BiFunction pathOrJarConstructor; private final Map versionCache = new IdentityHashMap<>(); @@ -53,9 +54,13 @@ public SortedJarOrPathList(CompatibilityLayer compatibilityLayer, Function`, resulting // in versions being reported as the string "Optional.empty" or "Optional[1.2.3]" instead of `null` or "1.2.3". @@ -119,13 +124,24 @@ public static SecureJar getJar(Object pathOrJar) { } private JarMetadata getMetadata(SecureJar jar) { + Class implClass = jar.getClass(); + Function metadataGetter = metadataGetters.get(implClass); if (metadataGetter == null) { try { - metadataGetter = UnsafeHacks.makeGetter(jar.getClass().getDeclaredField("metadata")); + String implName = implClass.getName(); + switch (implName) { + case "org.sinytra.connector.service.DummyVirtualJar": + // Used for the dummy fabric-loader mod as well as for code generated by ManninghamMills + metadataGetter = __ -> null; + break; + default: // probably the main ModLauncher-internal impl + metadataGetter = UnsafeHacks.makeGetter(implClass.getDeclaredField("metadata")); + } } catch (Throwable t) { - LOGGER.error("Failed to get metadata from " + jar.getClass() + ":", t); + LOGGER.error("Failed to get metadata from " + implClass + ":", t); metadataGetter = __ -> null; } + metadataGetters.put(implClass, metadataGetter); } return metadataGetter.apply(jar); }