私のアプリケーションは、GUI に Standard Widget Toolkit (SWT) を使用しています。私の問題は、32 ビット SWT ライブラリが 64 ビット JVM で動作しないことです。しかし、私は、ソフトウェアを入手するときに人々に正しいアーキテクチャを選択させたくありません。そのため、32 ビットと 64 ビットの両方のライブラリをバンドルし、実行時にアーキテクチャを自動検出したいと考えています。次のように、JVMの正しいアーキテクチャを取得できることがわかりました。
if (System.getProperty("os.arch").contains("64")) {
// ...
}
あとは、jar をロードするだけです。しかし問題は、私が見つけたすべての例では、クラスを使用する前に手動でクラスをロードする必要があることです。
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
) で jar を追加した後は、NoClassDefFoundError
. はい、ファイルが存在することを再確認しました。