役立たずのプログラマーブログ

自分の得た知識や経験をブログに書くことで整理し、考えをまとめることが目標

MANIFEST.MFとjarファイル

2008-01-09 09:24:00 | プログラム
eclipseでexport->jar形式のファイルってしてやっても、なんかうまくいかない。
やり方があるのだろうけど、そもそもウィザード任せはよくないので、
ちょっと調べた。忘れても良いようにメモしておく。
(何ヶ所か改行が変なのは、gooのTextエディターがおかしいため)

Sunの説明ページ(英語)
教えてgooでの解説

eclipseで出力したjarファイルは、なんかMETA-INF/MANIFEST.MFの記述がそのままでは色々と足りない。なので一度解凍してみる。
$jar -xf jarfile.jar

そして、MANIFEST.MFにメインクラス(エントリーポイント)と必要なモジュールへのパスを書く。
(両者ともにコマンドラインから指定可能だが後で説明する)
$cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Main-Class: ConnectionManager/ConnectionManager
Class-Path: . /usr/share/java/mysql-connector-java.jar

Name: ConnectionManager/
Sealed: true

アトリビュート内はスペース、アトリビュート間は空行で区切られる。
SealedはNameのクラス内に必要なクラスが入っていて、定義されているクラスは全て同じjarファイル内にあることを示し、バージョンの一貫性を保つためにあるらしい。
が、正直よくわからん。

Main-ClassとClass-Pathを書いたら、$jar -cvfm [jarfilename.jar] [MANIFEST.MF] [クラス]の形で指定してjarファイルにする。
$jar -cvfm test.jar META-INF/MANIFEST.MF ConnectionManager/ConnectionManager.class

こういうのが出たら、何か指定が間違っているか、MANIFEST.MFがおかしい。
java.io.IOException: invalid header field
        at java.util.jar.Attributes.read(Attributes.java:393)
        at java.util.jar.Manifest.read(Manifest.java:182)
        at java.util.jar.Manifest.<init>(Manifest.java:52)
        at sun.tools.jar.Main.run(Main.java:132)
        at sun.tools.jar.Main.main(Main.java:1022)

うまくできたら実行してみる。
$java -jar test.jar


MANIFEST.MFに記述せずにコマンドから指定するときは、
$java -cp [クラスパス and ./][
Main-Class] [jarfile.jar]
$java -cp ./mysql-connector-java.jar:./ ConnectionManager/ConnectionManager test.jar

最新の画像もっと見る