実行時にクラスパスを追加する
問題
一般的にJavaアプリケーションを構成するものは、そのアプリ自体の.classからなる.jarファイル(これを仮にapp.jarとする)だけではない。サードパーティ製の多数の.jarファイルが必要になる。アプリの実行時に、これらの.jarファイルがクラスパス上に存在しなければアプリケーションは動作できない。
クラスパスの指定方法として、一般的には以下のようなものがある。
- 1.コマンドラインにて指定する方法
java -cp A.jar;B.jar;C.jar -jar app.jar
- 2.jarファイルのマニフェスト内に記述する方法
Manifest-Version: 1.0 Main-Class: .... Class-Path: ....
- 3.サードパーティ製の.jarファイルをほぐしてしまい、.classの形にしてからapp.jarにまとめてしまう方法
いずれも問題がある。1.はいかにも面倒だし、jarファイルをダブルクリックした場合の起動には対応できない。2.はスタンダードな方法ではあるが、ライブラリの増減のある場合には面倒かもしれない。 3.は、サードパーティ製ライブラリがGPLライセンスの場合は問題である。ユーザ側で容易にライブラリの変更ができないからである。
もっと簡単な方法はないものか?例えば、「java -jar app.jar」あるいはダブルクリックして起動されると、特定のフォルダ(例えばapp.jarと同じフォルダ内のlibフォルダ)を探し、そこにあるすべての.jarファイルをクラスパスに追加してから起動するようなことができないものか?
※もちろん、libフォルダ内を探索するコード部分では、libフォルダ内の.jarファイルは使用しないものとする。
解決策の提案
解決策としては以下が考えられる。
- システムクラスローダに無理矢理クラスパスを指定する。
- クラスパス指定された新たなプロセス起動する。
- クラスパスを指定された新たなクラスローダを作成して後の実行はそれに任せる。