Fix up mod classloading delegation

This commit is contained in:
Christian committed 2012-07-23 22:54:36 -02:30
1 parent 2671641b83
commit f78400711e
4 files changed
+54 -38

No files matched your search

+1 -1
View File
@@ -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());
}
/**
@@ -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<URL> urls=mainClassLoader.getSources();
File[] sources=new File[urls.size()];
try
{
for (int i = 0; i<urls.size(); i++)
{
for (int i=0; i<pUrl.length; i++) {
sources[i]=new File(pUrl[i].toURI());
}
return sources;
}
catch (URISyntaxException e)
{
Loader.log.throwing("ModClassLoader", "getParentSources", e);
sources[i]=new File(urls.get(i).toURI());
}
return sources;
}
catch (URISyntaxException e)
{
Loader.log.log(Level.SEVERE, "Unable to process our input to locate the minecraft code", e);
throw new LoaderException(e);
}
Loader.log.severe("Unable to process our input to locate the minecraft code");
throw new LoaderException();
}
}
@@ -2,13 +2,18 @@ package cpw.mods.fml.relauncher;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RelaunchClassLoader extends URLClassLoader
{
private List<URL> sources;
public RelaunchClassLoader(URL[] sources)
{
super(sources);
this.sources = new ArrayList<URL>(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<URL> getSources()
{
return sources;
}
}
@@ -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)