« svndumpfilter | Main | 1日5000タッチ »

2007.06.08

起動後に外部Jarファイル内のクラスを利用

 何らかのユーティリティーで、起動後のユーザ操作等でJarファイルを指定し、その中のクラスを利用したいような場合・・・例えば、データベース関係のユーティリティーとかですかね。
 ユーティリティー(ツール)実行時にクラスパスに含めるjarファイルは最小限にし、データベースに接続する際にJDBCドライバが含まれているjarファイルも指定して接続とかそんな感じのイメージ。

 実際にJDBC接続までテストしたというわけではありませんが、起動時にクラスパスに含まれていなかったjarファイル内のクラスを読み込む部分だけ試してみました。

 ざっくりと、こんな感じ。

URL[] urls = new URL[1];
urls[0] = new URL("jar:file:lib/test.jar!/");
URLClassLoader loader = new URLClassLoader(urls);
Class<?> c = loader.loadClass("test.Hoge");
Object o = c.newInstance();

 カレントフォルダを基準に、libフォルダ内のtest.jarファイルに含まれている、test.Hogeクラスのオブジェクトを新規作成します。ファイルがない、クラスが存在しない等、いろいろな例外が発生する可能性がありますが、そのあたりに問題がなければオブジェクトは生成されます。

 もっとも、このオブジェクトのメソッドを利用する場合はリフレクションを駆使する等、いろいろと手間がかかるので、実際に利用する場合はインタフェースを経由する(そのインタフェースを実装したクラスを後で指定したjarファイルからロードする)ようになると思われます。

 なお、DB接続に関して調べてみたところ、DriverManagerのJavaDocによると

DriverManager は、初期化時にロードされたドライバや、現アプレットあるいはアプリケーションと同じクラスローダを使用して明示的にロードされたドライバの中から適切なドライバを探そうとします。

ってことなので、後から追加したjarファイル内のドライバのロードはできないようです。
 が、http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17621&forum=12&start=8&13に記載されているような感じで行うと、問題なくドライバのロードもできました。

|

« svndumpfilter | Main | 1日5000タッチ »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference 起動後に外部Jarファイル内のクラスを利用:

« svndumpfilter | Main | 1日5000タッチ »