重複の可能性:
JAR から InputStream としてロードしていますか?
入力ストリーム (URL 接続など) から jar ファイルをロードし、それをクラスローダーにロードして実行することはできますか? 御時間ありがとうございます。
重複の可能性:
JAR から InputStream としてロードしていますか?
入力ストリーム (URL 接続など) から jar ファイルをロードし、それをクラスローダーにロードして実行することはできますか? 御時間ありがとうございます。
はい; URLClassLoader
この目的のために意図されています。URL の配列からクラスをロードできます。
URL externalJar = new URL("http://example.com/app.jar");
URL localJar = new URL("C:/Documents/app.jar");
URLClassLoader cl = new URLClassLoader(URL[]{ externalJar, localJar });
Class<?> clazz = cl.loadClass("SomeClass"); // you now can load classes
InputStream
に基づいていない場合はURL
、代わりにストリームの内容を一時的な jar ファイルに書き込んでから、上記のアプローチを使用してロードすることができます。( jar を完全にメモリにロードできます。つまり、一時ファイルは作成されませんが、カスタム ClassLoader を定義する必要があるため、この方法を正しく行うにはかなりの労力が必要です)。
public static URL getJarUrl(final File file) throws IOException {
return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
}
これは、Lib の URL を適切に取得します。これは、Jar ファイルが URL を取得しようとするときに奇妙なことを行うためです。