2

我正在尝试为一个使用 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 加载类的简单方法。我在其他项目上测试过,它工作正常。

4

0 回答 0