diff --git a/fml/common/cpw/mods/fml/common/Loader.java b/fml/common/cpw/mods/fml/common/Loader.java index b82c2e8c50..c223ea6dac 100644 --- a/fml/common/cpw/mods/fml/common/Loader.java +++ b/fml/common/cpw/mods/fml/common/Loader.java @@ -177,7 +177,7 @@ public class Loader } log.info(String.format("Forge Mod Loader version %s.%s.%s.%s for Minecraft c:%s, s:%s loading", major, minor, rev, build, mccversion, mcsversion)); - modClassLoader = new ModClassLoader(); + modClassLoader = new ModClassLoader(getClass().getClassLoader()); } /** diff --git a/fml/common/cpw/mods/fml/common/ModClassLoader.java b/fml/common/cpw/mods/fml/common/ModClassLoader.java index 44b9196fe0..526f639a2c 100644 --- a/fml/common/cpw/mods/fml/common/ModClassLoader.java +++ b/fml/common/cpw/mods/fml/common/ModClassLoader.java @@ -19,61 +19,55 @@ import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; +import java.util.List; +import java.util.logging.Level; + +import cpw.mods.fml.relauncher.FMLEmbeddingRelauncher; +import cpw.mods.fml.relauncher.RelaunchClassLoader; /** * A simple delegating class loader used to load mods into the system - * - * + * + * * @author cpw * */ public class ModClassLoader extends URLClassLoader { - - public ModClassLoader() - { - super(new URL[0], ModClassLoader.class.getClassLoader()); - } + private RelaunchClassLoader mainClassLoader; public ModClassLoader(ClassLoader parent) { super(new URL[0], null); + this.mainClassLoader = (RelaunchClassLoader)parent; } + public void addFile(File modFile) throws MalformedURLException { - ClassLoader cl=getParent(); - if (cl instanceof URLClassLoader) { - URLClassLoader ucl=(URLClassLoader) cl; URL url = modFile.toURI().toURL(); - try { - Method addUrl=URLClassLoader.class.getDeclaredMethod("addURL", URL.class); - addUrl.setAccessible(true); - addUrl.invoke(ucl, url); - } catch (Exception e) { - Loader.log.severe("A fatal error occured attempting to load a file into the classloader"); - throw new LoaderException(e); - } - } + mainClassLoader.addURL(url); } - + + @Override + public Class loadClass(String name) throws ClassNotFoundException + { + return mainClassLoader.loadClass(name); + } + public File[] getParentSources() { - ClassLoader cl=getParent(); - if (cl instanceof URLClassLoader) { - URLClassLoader ucl=(URLClassLoader) cl; - URL[] pUrl=ucl.getURLs(); - File[] sources=new File[pUrl.length]; - try + List urls=mainClassLoader.getSources(); + File[] sources=new File[urls.size()]; + try + { + for (int i = 0; i sources; + public RelaunchClassLoader(URL[] sources) { super(sources); + this.sources = new ArrayList(Arrays.asList(sources)); } @Override @@ -29,8 +34,14 @@ public class RelaunchClassLoader extends URLClassLoader } @Override - protected void addURL(URL url) + public void addURL(URL url) { super.addURL(url); + sources.add(url); + } + + public List getSources() + { + return sources; } } diff --git a/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java b/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java index 383e3682c9..06ea3e2029 100644 --- a/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java +++ b/fml/common/cpw/mods/fml/relauncher/RelaunchLibraryManager.java @@ -19,6 +19,8 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.FileChannel.MapMode; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.JOptionPane; @@ -78,6 +80,15 @@ public class RelaunchLibraryManager } + try + { + Class loaderClazz = Class.forName("cpw.mods.fml.common.Loader", true, actualClassLoader); + } + catch (Exception e) + { + // Load in the Loader, make sure he's ready to roll + throw new RuntimeException(e); + } } private static String generateChecksum(File file)