07 May 2008

Java SWT アプリケーションの JAR パッケージ手法

(2015年4月12日に全面書き換え)

Java SWTアプリケーションを作成し、「ユーザ配布用のJARファイル」を作ったところ、SWTライブラリが見つからないというエラーに遭遇。

Eclipseでの外部ライブラリの登録と、Javaバージョンの指定

プロジェクト − プロパティ − Javaのビルドパス にて、SWTライブラリーを登録する。

プロジェクト − プロパティ − Javaのビルドパス にて、JREシステムライブラリーの設定を編集し、実行環境を適宜設定する。

20080507-javase-setver.jpg

なお、Java 8 (バージョン 1.8)の時は、推奨範囲の1.6か1.7までしかダウングレード出来ない。

ライブラリをjarファイルに同梱する手法

ファイル − エクスポート − Java より『実行可能JARファイル』のエクスポートを選択する

20080507-jar-export.jpg

次に表示されるダイアログで、『生成されるJARに必須ライブラリーをパッケージ』を選択する

20080507-jar-libinclude.jpg

この状態で配布されるjarファイルは単体で配布可能で、次のコマンドで起動できる。

$ java -jar ○○○.jar

ライブラリをjarファイルに同梱しない手法

上の例で、『実行可能JARファイル』のエクスポートを選択した後のダイアログで、『生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー』を選択する。

20080507-jar-libext.jpg

パッケージされたjarを配布する場合、必須ライブラリーは指定された(当初出力された)ディレクトリに格納した状態で実行する必要がある。このディレクトリを変更する場合は、jarパッケージの中の次のファイルを編集し、ライブラリーの位置を指定する。

META-INF/MANIFEST.MF
Manifest-Version: 1.0
Class-Path: . JavaTextViewer_lib/swt.jar
Main-Class: com.example.textviewer.test.TextViewerTest

ディレクトリは空白文字で区切り、最初はカレントディレクトリを示す「.」(ドット)でなければならない。

過去の記事(保存)

解決手法1

swt.jar ライブラリの全ファイルを、作成するjarファイルに格納する。
(swt.jarをバラバラに分解して、再格納して配布するのが、ライセンス上問題にならないか心配…)

20080507-jar-org.png
オリジナルのjarファイル


20080507-jar-add.png
swt.jarライブラリを無理やり追加したjarファイル
(赤でかこった部分が、swt.jarからコピーしてきた部分)

ファイルの展開・圧縮は、Gnomeの書庫マネージャを使って行っている。
(Windowsの場合は、素直にコマンドラインのjarを使うしかないかな…)

解決手法2

jarファイルのMETA-INF/MANIFEST.MFファイルを書き換えて、クラスライブラリのパスを追加する。

META-INF/MANIFEST.MF
Manifest-Version: 1.0
Main-Class: HelloJavaSwt
Class-Path: ./ ./swt.jar

こうしておいて、同じフォルダに配布するjarファイルと、swt.jarを格納すればOK。

なお、jarファイルはEclipseのファイルメニューのエクスポートで作成したものを使っているが、コマンドラインで作成することも出来る。

# jar cvfm test1.jar MANIFEST.MF *.class
マニフェストが追加されました。
HelloJavaSwt.class を追加中です。(入 = 1188) (出 = 700)(41% 収縮されました)

jarファイルとマニフェストファイルの順序は、jarに与えるスイッチの fm というファイル順序に依存している。

参考にしたページ
Sun :  jar - Java ARchive ツール

jarでファイルをまとめる

jarファイルに外部ライブラリを含めたい


最近、どうも脱線ぎみです…
本来なら、携帯電話用MIDPでプログラムを作る納期が迫っているにもかかわらず…