* ClassPathを動的に追加する [#v82806f9]

商用アプリでは、まず使う事はないが、自作ツールやテストコードの実行時にはけっこう便利。

【 テストソース 】
 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)


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS