From 7a62c8e1afbbe0992ccbf6abc524900c357f95d5 Mon Sep 17 00:00:00 2001 From: Duy Tran Khanh Date: Thu, 18 Feb 2021 15:57:24 +0700 Subject: [PATCH] Custom ClassLoader (attempt fix Forge and Fabric) --- .../net/kdt/pojavlaunch/PojavClassLoader.java | 20 +++++++++++++++++++ .../main/java/net/kdt/pojavlaunch/Tools.java | 13 +++++++++++- Natives/JavaLauncher.c | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 JavaApp/src/main/java/net/kdt/pojavlaunch/PojavClassLoader.java diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavClassLoader.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavClassLoader.java new file mode 100644 index 00000000..2a60b9b9 --- /dev/null +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/PojavClassLoader.java @@ -0,0 +1,20 @@ +package net.kdt.pojavlaunch; + +import java.net.*; + +/** + * This class loader is used as system class loader + * as a workaround to modded libraries for Java 8 + * compatibility that safety casting to URLClassLoader: + * ((URLClassLoader) ClassLoader.getSystemClassLoader()) + */ +public class PojavClassLoader extends URLClassLoader { + public PojavClassLoader(ClassLoader parent) { + super(new URL[0], parent); + } + + @Override + public void addURL(URL url) { + super.addURL(url); + } +} \ No newline at end of file diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java index 1ec6ff7e..f96c2609 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -102,17 +102,28 @@ public final class Tools bw.close(); */ +/* final List urlList = new ArrayList<>(); for (String s : launchClassPath.split(":")) { if (!s.isEmpty()) { urlList.add(new File(s).toURI().toURL()); } } +*/ new Thread(() -> { try { System.out.println("Args init finished. Now starting game"); - URLClassLoader loader = new URLClassLoader(urlList.toArray(new URL[0]), ClassLoader.getSystemClassLoader()); + // URLClassLoader loader = new URLClassLoader(urlList.toArray(new URL[0]), ClassLoader.getSystemClassLoader()); + + PojavClassLoader loader = (PojavClassLoader) ClassLoader.getSystemClassLoader(); + + for (String s : launchClassPath.split(":")) { + if (!s.isEmpty()) { + loader.addURL(new File(s).toURI().toURL()); + } + } + Class clazz = loader.loadClass(versionInfo.mainClass); Method method = clazz.getMethod("main", String[].class); method.invoke(null, new Object[]{launchArgs}); diff --git a/Natives/JavaLauncher.c b/Natives/JavaLauncher.c index 13e241cc..68b0bda1 100644 --- a/Natives/JavaLauncher.c +++ b/Natives/JavaLauncher.c @@ -86,6 +86,7 @@ int launchJVM(int argc, char *argv[]) { if (!started) { margv[margc++] = "/usr/lib/jvm/java-16-openjdk/bin/java"; margv[margc++] = "-XstartOnFirstThread"; + margv[margc++] = "-Djava.system.class.loader=net.kdt.pojavlaunch.PojavClassLoader"; margv[margc++] = "-Djava.library.path=/Applications/PojavLauncher.app/Frameworks"; margv[margc++] = "-Duser.dir=/var/mobile/Documents/minecraft"; margv[margc++] = "-Duser.home=/var/mobile/Documents";