私は、現在のOS用のプラットフォーム依存ライブラリjarを動的にロードする方法を見つけようとしています。私は、JNI呼び出しを使用する第三者のライブラリにアクセスする必要があり、MacとWindowsでは異なるJarファイルを持っています。 2つのライブラリの呼び出しと戻りはすべて同じですが、コンパイル後にlibディレクトリのjarファイルを単に交換するだけですが、実行時にどのjarをロードするかをアプリケーションが判断できるようにしたいと考えています。OSに応じて動的にjarをロード
私はここに同様の記事を見つけましたが、この質問に直接対処するものはありません。 this postはClassLoaderを介して動的にjarファイルをロードする方法を示していますが、私が収集した内容から、Method method = clazz.getDeclaredMethod("methodName")
、method.invoke()
というアプローチを使用して、そのクラスが提供するメソッドを呼び出す必要があります。クラスローダー(これは私が避けたいものです)。
私はのようになります解決策を見つけることを願っています:
import external.lib.namespace.LibClassA;
import external.lib.namespace.LibClassB;
public class MyClass {
static {
if (System.getProperty("os.name").contains("Windows") {
ClassLoader.getSystemClassLoader().load("Lib_win.jar");
} else {
ClassLoader.getSystemClassLoader().load("Lib_mac.jar");
}
}
public static void Main(String[] args) {
LibClassA.platformDependantCall();
LibClassB.someOtherCall();
}
}
両方のジャーがクラスパスにある場合はどうなりますか? –
@ MarkRobinson - 私はJava ClassLoaderの仕組みについて熟練していませんが、私の経験上、jarに別のjarやJava APIと同じ名前空間と名前を持つクラスが含まれている場合、ClassLoaderは、 。おそらく、ロードする方法を決定するために使用されるいくつかの方法がありますが、これは関係なくこの状況で役立ちません。私がこれについて間違っていて、誰かがさらに説明したいのであれば、してください。ありがとう。 – IgnisFatuus