ClassPathを動的に追加する †商用アプリでは、まず使う事はないが、自作ツールやテストコードの実行時にはけっこう便利。 【 テストソース 】 import java.io.File; import java.io.FileWriter; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.ResourceBundle; public class TestAddClassPath { /** * メイン処理。<br /> * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // ClassPathに追加するディレクトリ String newClassPath = "C:\\tmp"; // 確認用プロパティファイルの作成 FileWriter writer = new FileWriter(newClassPath + File.separator + "TestApp.properties"); writer.write("VAR=1234567890"); writer.flush(); writer.close(); // まずClassPathが通っていない状態でプロパティファイルを読み込んでみる printPropVal("TestApp", "VAR"); // ClassPathの追加 addClassPath(newClassPath); // 再度プロパティファイルを読み込み printPropVal("TestApp", "VAR"); } /** * ClassPathの追加。<br /> * @param path 追加するPATH */ private static void addClassPath(String path){ URLClassLoader loader = (URLClassLoader)ClassLoader.getSystemClassLoader(); try { URL u = new File(path).toURI().toURL(); Method m = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{ URL.class }); m.setAccessible(true); m.invoke(loader, new Object[]{u}); System.out.println("ClassPathに「" + path + "」を追加しました"); } catch (Exception e){ throw new RuntimeException("ClassPathの追加に失敗しました。(" + path + ")", e); } } /** * プロパティファイルから値を読み込んで表示する。<br /> * @param propFile プロパティファイル名 * @param key キー名 */ private static void printPropVal(String propFile, String key){ try { // キャッシュをクリア ResourceBundle.clearCache(); // プロパティファイルを読み込み ResourceBundle bundle1 = ResourceBundle.getBundle(propFile); String var = bundle1.getString(key); System.out.println("読込み成功(" + key + "=" + var + ")"); } catch (Exception e){ System.out.println("読込み失敗(" + e.getMessage() + ")"); } } } 【 実行結果 】 読込み失敗(Can't find bundle for base name TestApp, locale ja_JP) ClassPathに「C:\tmp」を追加しました 読込み成功(VAR=1234567890) |