クラスパスに動的にJARファイルを追加(Java8)
【PR】当サイトはプロモーションが含まれています。
起動時に -classpath/-cp によりJARファイルを指定するのではなく、実行中に任意のJARファイルを動的にクラスパスに追加します。指定された ClassLoader が URLClassLoader を継承していない場合は、それを親として URLClassLoader を作成します。Java 9 以降では AppClassLoader は URLClassLoader を継承しません。
/** * 指定された ClassLoader にクラスパスを追加します。 * * @param classLoader ClassLoader * @param urls URL[] * @return URLClassLoader パラメータの ClassLoader が URLClassLoader を継承している場合はその ClassLoader。継承していない場合は、その ClassLoader を親とした新しい URLClassLoader のインスタンスを返します。 */ public static URLClassLoader addClassPath(ClassLoader classLoader, URL[] urls) throws Exception { URLClassLoader urlClassLoader = null; if (classLoader instanceof URLClassLoader) { urlClassLoader = (URLClassLoader)classLoader; } else { urlClassLoader = URLClassLoader.newInstance(urls, classLoader); } Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); method.setAccessible(true); for (int i = 0; i < urls.length; i++) { URL url = urls[i]; method.invoke(urlClassLoader, new Object[] { url }); } return urlClassLoader; }
使用例は次の通り。
public void test() throws Exception { File file = new File("C:\\temp\\lib.jar"); URL[] urls = { file.toURI().toURL() }; addClassPath(this.getClass().getClassLoader(), urls); }
※以下追記(2024/06/04)
Java9以降では別の対応が必要です。