我的应用程序使用标准小部件工具包 (SWT) 作为它的 GUI。我的问题是 32 位 SWT 库不能在 64 位 JVM 上运行。但我不想让人们在获取软件时选择正确的架构。所以,我想捆绑32 位和64 位库,并在运行时自动检测架构。我发现我可以像这样获得正确的 JVM 架构:
if (System.getProperty("os.arch").contains("64")) {
// ...
}
现在剩下的就是加载罐子了。但问题是,我发现的所有示例都要求您在使用之前手动加载该类。
Class.forName("MyClass", false, myClassLoader);
所以我的问题是,是否可以“注册”我的类加载器,这样我就不必事先加载类?
更新: 我创建了自己的子类,URLClassLoader
并使用命令行参数将其设置为默认类加载器-Djava.system.class.loader
;但我收到此错误:
Error occurred during initialization of VM
java.lang.Error: java.lang.NoSuchMethodException: com.program.LibraryLoader.<init>(java.lang.ClassLoader)
at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
我认为LibraryLoader.<init>
是指构造函数......但它在那里(public LibraryLoader(URI[] urls)
)。
更新 2:几乎就在那里,JVM 现在运行。我添加了这个构造函数以使其工作:
public LibraryLoader(ClassLoader classLoader) {
super(new URL[0], classLoader);
}
但是在使用addPath()
( file:lib/jars/swt.jar
) 添加罐子后,它只会产生一个NoClassDefFoundError
. 是的,我仔细检查了该文件是否存在。