クラスパスに動的に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以降では別の対応が必要です。

クラスパスに動的にJARファイルを追加(Java9以降)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です