Java9 まで、プログラムで使用するすべての人が実行時にクラスパスに外部jarを追加します。
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.invoke(sysloader, new Object[]{file.toURI().toURL()});
Java9では、問題が発生します。
スレッド「メイン」の例外Java.lang.ClassCastException:Java.base/jdk.internal.loader.ClassLoaders $ AppClassLoaderをJava.base/Java.net.URLClassLoaderにキャストできません
URLClassLoader
はJava 9.では機能しなくなりました。実行時にプログラムで外部jarをクラスパスに追加するには、jdk9で何をしますか?
JavaSE9リリースノート ほぼ同じことを読んでください:
アプリケーションクラスローダーは、_
Java.net.URLClassLoader
_(以前のリリースでは指定されていなかった実装の詳細)のインスタンスではなくなりました。_
ClassLoader::getSytemClassLoader
_ がURLClassLoader
オブジェクトを返すことを前提とするコードを更新する必要があります。Java SEとJDKは、実行時にクラスパスを動的に拡張するためのアプリケーションまたはライブラリ用のAPIを提供しないことに注意してください。
さらに、拡張クラスパスが必要な場合は、
_Class<?> clazz = Class.forName("nameofclass", true, new URLClassLoader(urlarrayofextrajarsordirs));
_
これで提案されているように Oracleからのスレッド 。これには注意が必要です。
_
Java.util.ServiceLoader
_は、スレッドのClassLoaderコンテキストThread.currentThread()。setContextClassLoader(specialloader);を使用します。_
Java.sql.DriverManager
_は、スレッドのClassLoaderではなく、呼び出し元のクラス 'ClassLoaderを尊重します。Class.forName("drivername", true, new URLClassLoader(urlarrayofextrajarsordirs).newInstance();
を使用して直接ドライバーを作成します_
javax.activation
_は、スレッドのClassLoaderコンテキストを使用します(javax.mailにとって重要)。