Windowシステムが一般化して、プログラムの実行はプログラムファイルのダブルクリックやメニューからの選択で行うことが普通になっています。その中で、いままでやってきたJavaのプログラムは、端末からコマンドをキーボードで打たなければなりませんでした。
実行結果が文字で端末内に出力されるならまだしも、Window(Javaの言葉ではフレーム)が出てくるプログラムを端末から実行するのはあまりスマートとは言えません。
Javaプログラムをダブルクリックで実行するために MS Windowsで よく使われるのが jar ファイルにする方法です。Linuxでも使えますが、Linuxでは,jarファイルがアーカイブとしてすでに位置づけられているために,うまくいかない可能性があります。これについてはこのページの下方Linuxでのjarの扱いで、Linuxでのbetterなやり方はLinuxにおけるGUI実行で説明します。
アーカイブとはファイルをまとめる機能で多くの場合ファイルの大きさを小さくできます。jarの他にも.zipの拡張子のついたジップファイルや.lzhの拡張子のLHAファイルなど同様のアーカイブの形式があります。このようなアーカイブはたくさんのファイルをまとめて小さく保存したり配布したりするために考えられました。
三択問題のようなjavaプログラムをコンパイルするとClassファイルが複数できます。また.javaのファイルがひとつであっても複数のClassファイルに分割されることがあります。このような複数のファイルをまとめて、さらにどのクラスファイルから実行を開始するのかの情報を加えてひとつのファイルにしたものがjavaで使われるjarファイルです。
これはCプログラムをコンパイルした時にできるような実行ファイルになるわけではなく、ワープロの文書ファイルをダブルクリックするとワープロのプログラムが起動されて文書ファイルを読んで表示するのと同様に、javaインタープリタが .jarファイルを読んで中にあるプログラムを実行するという仕組みです。
例として SanTakuF.java を jar にすることをやってみます。
(1)SanTakuF.javaをコンパイルすると、SanTakuF.class ができます。この他にSanTakuF.javaの実行にはMondaishuu.classとToi.class, ファイル選択にMyFileFilter.classが必要です。この4つを(2)のマニフェストファイルと一緒にまとめます。
(2)次の内容のテキストファイルを作り、適当なファイル名で保存します。この例ではSanTakuF.txtとしました。このファイルをマニフェストファイルと呼びます。
Main-Class: SanTakuF
この中の SanTakuFは実行するmainを含むクラス名です。いままで 「 java クラス名 」 で実行していたクラス名を書きます。
最後は必ず改行します。(Linuxでは改行しなくても大丈夫)
(3)jarコマンドで次のように命令します。
$ jar cvfm SanTakuF.jar SanTakuF.txt SanTakuF.class Mondaishuu.class Toi.class MyFileFilter.class
次のような意味です。
SanTakuFで名前を揃えているのはわかりやすいようにであってMain-Class:の名前があっていれば他は違う名前でもかまいません。
以下のように表示され SanTakuF.jar というファイルができます。
~/java$ jar cvfm SanTakuF.jar SanTakuF.txt SanTakuF.class Mondaishuu.class Toi.class MyFileFilter.class マニフェストが追加されました。 SanTakuF.class を追加中です。(入 = 3924) (出 = 2158)(45% 収縮されました) Mondaishuu.class を追加中です。(入 = 2023) (出 = 1252)(38% 収縮されました) Toi.class を追加中です。(入 = 286) (出 = 213)(25% 収縮されました) MyFileFilter.class を追加中です。(入 = 616) (出 = 378)(38% 収縮されました) ~/java$
(4)SanTakuF.jarをダブルクリックすると実行できます。Linuxの場合は調整が必要な場合があります。次の項目として書きます。
ファイルの選択から始まりますが、Windowsの場合はjarファイルのあるフォルダ、Linuxの場合はユーザーホームの一覧から始まります。つまりカレントディレクトリが異なるというわけです。
GUIでのjarの実行では指定しないとエラーが表示されません。MyFileFilter.classを忘れるとダブルクリックしても何も起こらないということになります。
この様な時は次の様なコマンドをうつと分かるかもしれません。
$ tail ~/.xsession-errors
こんなのが出てきたら、MyFileFilterがないと言っていると分かります。
Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter
jarというのはもともとファイルを圧縮してまとめる「アーカイブソフト」のひとつです。
$ jar cvf matome file01 file02 file03 …
これで matome というファイルに、file01 file02 file03 … が圧縮されてひとまとめにされます。
中身を調べるには、
$ jar tvf matome
解凍して元に戻すには
$ jar xvf matome
この中にマニフェストファイルがあります。 このファイルはそのまままとめられるのではなく、その内容を読み込んで、META-INF/MANIFEST.MF というファイルの中に書き加えられるのです。
このようにjarファイルはclassファイルをまとめただけのものですから、Java 2 SDK, Standard Edition(JavaSDK)または、JREと呼ばれる実行環境がインストールされていないと実行できません。つまり java matome で matome.class を実行できる環境でないと matome.jar も実行できいのです。
本校のLinuxはDebianでGNOMEというデスクトップ環境になっています。以下の話はGNOMEでのものになります。
Linuxでのjarのアイコンです。同じLinuxでもシステム設定によりアイコンが異なりますが、jarはもともとアーカイブなのでしまっておく箱のイメージになっていることが多いのです。
アーカイブなので、ダブルクリックで書庫の管理ソフト(書庫マネージャ)が起動するようになっていることが多いのです。
書庫マネージャの様子です。Classファイルが入っていてMETA-INFというフォルダも見えます。この中に MANIFEST.MF というファイルがあってマニフェストファイルの内容が格納されています。
アイコンの上で右クリックをします。出てくるメニューの一番上に書庫マネージャがあります。ダブルクリックで書庫マネージャが出てくるのはこのためです。2番目に java のランタイムがあります。これで開くとjavaプログラムが実行されます。
ダブルクリックでjavaプログラムが実行されるように設定できます。一番下の[プロパティ]を選択します。
書庫マネージャと java のランタイムが出てきますので、 java のランタイムにチェックを入れます。
これでダブルクリックでjavaプログラムが実行されるようになりました。
Linuxではfreedesktopの様式でメニューやランチャなどのGUIの起動の仕組みが統一される方向にあります。
キーワードは .desktop ファイルです。MS Windows のショーカットに似た働きをしますが、これはテキストファイルなのでエディタで読み書きできます。
[Desktop Entry] Type=Application Name=SanTakuF Comment=SanTakuF-comment Exec=java -jar java/SanTakuF.jar Icon=ledpurple
このファイルを保存しただけではGnomeのファイルマネージャ上では次のように見えます。これは普通のファイルです。
これをダブルクリックすると次のようなメッセージが出ます。
もちろんこのファイルは提供元は時分で信用できますから「信用できるアプリにする」を選択するとアイコンが変わりますし、実行もできるようになります。
この操作はファイルに実行可能の印をつけているだけです。端末からファイルの詳細リストをとると
~/java$ ls -l SanTakuF.* -rw------- 1 z1c3s z1c3s 3907 2011-10-25 14:15 SanTakuF.class -rwx------ 1 z1c3s z1c3s 324 2011-10-25 21:01 SanTakuF.desktop -rw------- 1 z1c3s z1c3s 4331 2011-10-25 15:35 SanTakuF.jar -rw------- 1 z1c3s z1c3s 4771 2011-10-25 14:15 SanTakuF.java -rw------- 1 z1c3s z1c3s 21 2011-10-25 15:34 SanTakuF.txt
このxが実行可能の印です。rは読み込み可能、wは書き込み可能の印で、ファイルにどのような操作を許可しているかを表しています。これらをまとめてパーミッションといいます。
パーミッションの操作方法を知っている方が自由がききます。
実行可能にするには
~/java$ chmod u+x SanTakuF.desktop
元に戻すには
~/java$ chmod u-x SanTakuF.desktop
ファイル名はSanTaku.desktop のままですが、実行権をつけると表示が ファイル内の Name=SanTakuF に書かれたものに変わり、アイコンも変わります。
アイコンは取り決めにしたがって相当する画像ファイルから探してくれますが、自分で作ったものにすることも可能です。
ダブルクリックで実行するときの起点であるカレントディレクトリはユーザーホームになります。 .desktop をどこに置いてもそうなります。
jarを使うときは、Java -jar と書いて次にjarファイルを指定しますが、カレントディレクトリからみて SanTakuF.jar ファイルは java/ にあるので java/SanTakuF.jar と書かないと発見してもらえません。
java -jar と、どうせ Javaから書くのなら、jarにしなくてもよいのではと思いますか? 正解です。.classファイルのままでも実行できます。クラスパスを指定(-classpath java)しておいて、SanTakuF だけ書くとパスをたどって実行できます。
SanTakuF は SanTakuF.class の他にも Mondaishuu.class Toi.class などを使うのでこれを探すためにクラスパスが必要です。
Exec=java -classpath java SanTakuF
または
Exec=java -cp java SanTakuF
これはjavaというフォルダに使用するclassがあるという意味です。カレントディレクトリはユーザーホームなのでユーザーホームにあるjavaフォルダです。javaプログラムだからjavaなのではありませんから注意が必要です。
基本的には上記のSanTakuF.desktopのままでもいいのですが、jarを使わないように書き直しました。 また、メニューの登録する場所を示すために Categories= という行を追加しました。
[Desktop Entry] Type=Application Name=SanTakuF Comment=SanTaku Program Exec=java -cp java SanTakuF Icon=ledpurple Categories=Utility;
このファイルを、.local/share/applications/ という場所に入れるとメニューに現れます。
.localというフォルダは隠しフォルダで見えないのでエディタから保存するのはちょっと分かりにくいですが、できないことはありません。ただし applications/ はまだないかもしれません。
端末からやるほうが簡単かもしれません。最後の/を忘れずに
z1c3s@star00:~java$ cp SanTakuF.desktop ~/.local/share/applications/
これで、ディレクトリですと叱られたら
z1c1g@star00:~/java$ mkdir -p ~/.local/share/applications/ z1c1g@star00:~/java$ cp SanTakuF.desktop ~/.local/share/applications/
でOKです。うまくできているかの確認は次のようにします。
z1c1g@star00:~/java$ ls -l ~/.local/share/applications 合計 4 -rw-r--r-- 1 z1c1g z1c1g 267 2012-04-14 20:15 SanTakuF.desktop
メニューのアプリケーションのアクセサリにはいっているはずです。
システムのほうでメニュー項目が追加されたことに気が付かないことがあります。[システム]-[設定]-[メニュー]を一度開くと認識してくれます。
Categories=をUtility;からEducation;に替えると、メニューの場所が変わります。
Type=Application #Categories=Utility; Categories=Education;