java.lang.NoClassDefFoundError,但我成功创建了这个类的实例

时间:2012-11-10 08:13:38

标签: java classloader noclassdeffounderror lwjgl classnotfoundexception

我正在尝试为一个使用LWJGL的“游戏”编写启动器,我需要从其他JAR加载它的类。

所以我做了以下事情:

// ...

// The files that i must load.
String[] files = new String[] { "lwjgl.jar", "jinput.jar", "lwjgl_util.jar", "game_jar.jar" }; 

// Converting strings to URLs
urls = new URL[files.length];
 for ( int i = 0; i < files.length; i++ )
  urls[i] = new File(directoryWithMyJARsAsFileClass, files[i]).toURI().toURL();

// I'ts needed too
System.setProperty("org.lwjgl.librarypath", directoryWithMyLWJGLNativessAsFileClass.getAbsolutePath() + File.separator);
System.setProperty("net.java.games.input.librarypath", directoryWithMyLWJGLNativessAsFileClass.getAbsolutePath() + File.separator);

// All paths are correct, I tested it.

// Class loading
URLClassLoader loader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader())
// Object test = loader.loadClass("org.lwjgl.LWJGLException").newInstance(); // (2)
Object game = loader.loadClass("the.game.package.MainClass").newInstance(); // (1)

// ...

但是代码在(1)上崩溃并出现错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at my.own.packacge.MyLauncher.main(MyLauncher.java:##) <- ## pointing to (1)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 6 more

如果我将取消注释(2),那么将成功创建org.lwjgl.LWJGLException的实例,我可以用它做一些事情!类org.lwjgl.LWJGLException已加载并正常工作,但游戏无法使用它。 我的问题是“为什么?为什么?”。

我还反编译了游戏的主类,并看到org.lwjgl.LWJGLException首先从其他JAR导入:

...
import some.import.Class;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.ContextCapabilities;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GLContext;
import org.lwjgl.opengl.PixelFormat;
import org.lwjgl.util.glu.GLU;
import other.import.Class;
...

我是ClassLoaders的新手,所以也许我犯了愚蠢的错误?我使用URLClassLoader,因为我还没有找到从JAR加载类的其他简单方法。我在其他项目上测试过,它运行正常。

0 个答案:

没有答案