我创建了自己的URLClassLoader,并通过java.system.class.loader将其设置为系统类加载器.它已经初始化,并且一切正常,但是找不到我要加载的类.这是URLClassLoader:
public class LibraryLoader extends URLClassLoader
{
public LibraryLoader(ClassLoader classLoader)
{
super(new URL[0], classLoader);
}
synchronized public void addJarToClasspath(String jarName) throws MalformedURLException, ClassNotFoundException
{
File filePath = new File(jarName);
URI uriPath = filePath.toURI();
URL urlPath = uriPath.toURL();
System.out.println(filePath.exists());
System.out.println(urlPath.getFile());
addURL(urlPath);
}
}
我已确认该罐子存在,并且路径正确.这是我在程序中如何称呼它:
LibraryLoader loader = (LibraryLoader) ClassLoader.getSystemClassLoader();
loader.addJarToClasspath("swt.jar");
这是我得到的例外(第166行是指我尝试创建新Point的行:
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Point
at mp.MyProgram.loadArchitectureLibraries(MyProgram.java:116)
at mp.MyProgram.main(MyProgram.java:90)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.graphics.Point
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)
... 2 more
我什至尝试像这样显式加载类:
Class.forName("org.eclipse.swt.graphics.Point", false, loader);
是什么原因造成的?它不应该“正常工作”吗?
更新:这是MyProgram中的重要代码
public class MyProgram
{
// ...
public static void main(String[] args)
{
loadArchitectureLibraries();
// ...
}
public static void loadArchitectureLibraries()
{
LibraryLoader loader = (LibraryLoader) ClassLoader.getSystemClassLoader();
String architecture = System.getProperty("os.arch");
try {
if (architecture.contains("64")) {
loader.addJarToClasspath("swt-3.6.1-win32-win32-x86_64.jar");
} else {
loader.addJarToClasspath("swt-3.6.1-win32-win32-x86.jar");
}
Class.forName("org.eclipse.swt.graphics.Point", false, loader);
org.eclipse.swt.graphics.Point pt = new org.eclipse.swt.graphics.Point(0, 0);
} catch (Exception exception) {
exception.printStackTrace();
System.out.println("Could not load SWT library");
System.exit(1);
}
}
}
更新2:这是一个SSCCE:http://nucleussystems.com/files/myprogram.zip.调用java -Djava.system.class.loader = mp.LibraryLoader -jar myprogram.jar.
作者创建了一个自定义的URLClassLoader并设为系统类加载器,但加载特定类时出现NoClassDefFoundError错误。尽管确认了JAR文件的存在及其路径正确无误,仍然无法加载到所需的类。
1万+

被折叠的 条评论
为什么被折叠?



