Java での動的クラスパス変更: 総合ガイド
Java アプリケーションを開発する場合、クラスパスを動的に変更することが必要になる場合があります。この機能を使用すると、クラスパス ランタイムに JAR ファイルを追加または削除できるため、追加のライブラリをロードしたり、アプリケーションの動作をその場でカスタマイズしたりできます。
続行する前に
なぜクラスパスを動的に変更する必要があるのか疑問に思われるかもしれません。 Clojure REPL (Read-Eval-Print Loop) を使用するときに、特定の Clojure ソース ファイルにアクセスするために追加の JAR ファイルをクラスパスにロードする必要がある場合に、一般的なシナリオが 1 つ発生します。この必要性は、特に Emacs 上の Slime で Clojure を使用する場合に、Clojure を再起動することなく発生します。
Java 9 以降でのクラスパスの変更
Java 9 以降のバージョンでは、追加JAR ファイルをクラスパスに追加するには、インストルメンテーション API と Java エージェントを使用する必要があります。 「Launcher-Agent-Class」属性を使用して、ランチャー/メイン jar ファイルのマニフェストに埋め込みエージェントを指定できます。
Java 9 のシステム クラスローダーの考慮事項
開始Java 9 以降、システム java.lang.ClassLoader は java.net.URLClassLoader のインスタンスではなくなりました。この変更により、クラスパスの代わりにモジュールパスに影響を与えるには、java.lang.ModuleLayer などの代替アプローチを使用する必要があります。
Java 8 以前の動的クラスパス変更
Java 8 以前のバージョンの場合、クラスパスの変更には新しいクラスローダーの作成が含まれます。考慮すべき重要な点は次のとおりです。
動的クラスパス変更のコード例
次のコード例は、 URLClassLoader を使用してクラスパスを変更します。
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
// Add the "conf" directory to the classpath
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new File("conf").toURL()}, currentThreadClassLoader);
// Replace the thread classloader
Thread.currentThread().setContextClassLoader(urlClassLoader);
以下のコード スニペットに示すように、リフレクションを使用してこれを実現することもできます。
public void addURL(URL url) throws Exception {
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class clazz = URLClassLoader.class;
// Use reflection to add the URL to the classloader
Method method = clazz.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(classLoader, new Object[]{url});
}
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3