ダブルクリックで実行

Windowが出るのに端末から?

Windowシステムが一般化して、プログラムの実行はプログラムファイルのダブルクリックやメニューからの選択で行うことが普通になっています。その中で、いままでやってきたJavaのプログラムは、端末からコマンドをキーボードで打たなければなりませんでした。

実行結果が文字で端末内に出力されるならまだしも、Window(Javaの言葉ではフレーム)が出てくるプログラムを端末から実行するのはあまりスマートとは言えません。

jarファイルを作って実行

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

次のような意味です。

cvfm
オプション
c:新規に作成する
v:逐次報告をする 指定しないと黙って仕事をします
f:jarファイル名の指定をする(正確には指定する名前のファイルに書き出す)
m:マニフェストファイルの指定をする
SanTakuF.jar
作成するjarファイル名
SanTakuF.txt
マニフェストファイル名 (2)でつけた名前とあわせます
SanTakuF.class Mondaishuu.class Toi.class MyFileFilter.class
使用する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の場合はユーザーホームの一覧から始まります。つまりカレントディレクトリが異なるというわけです。

filechooser

エラーの表示

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というのはもともとファイルを圧縮してまとめる「アーカイブソフト」のひとつです。

$ 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でのjarの扱い

本校のLinuxはDebianでGNOMEというデスクトップ環境になっています。以下の話はGNOMEでのものになります。

Linuxでのjarのアイコンです。同じLinuxでもシステム設定によりアイコンが異なりますが、jarはもともとアーカイブなのでしまっておく箱のイメージになっていることが多いのです。

アーカイブなので、ダブルクリックで書庫の管理ソフト(書庫マネージャ)が起動するようになっていることが多いのです。

書庫マネージャの様子です。Classファイルが入っていてMETA-INFというフォルダも見えます。この中に MANIFEST.MF というファイルがあってマニフェストファイルの内容が格納されています。

アイコンの上で右クリックをします。出てくるメニューの一番上に書庫マネージャがあります。ダブルクリックで書庫マネージャが出てくるのはこのためです。2番目に java のランタイムがあります。これで開くとjavaプログラムが実行されます。

ダブルクリックでjavaプログラムが実行されるように設定できます。一番下の[プロパティ]を選択します。

書庫マネージャと java のランタイムが出てきますので、 java のランタイムにチェックを入れます。

これでダブルクリックでjavaプログラムが実行されるようになりました。

LinuxにおけるGUI実行

Linuxではfreedesktopの様式でメニューやランチャなどのGUIの起動の仕組みが統一される方向にあります。

キーワードは .desktop ファイルです。MS Windows のショーカットに似た働きをしますが、これはテキストファイルなのでエディタで読み書きできます。

ファイル名 SanTakuF.desktop

[Desktop Entry]
Type=Application
Name=SanTakuF
Comment=SanTakuF-comment
Exec=java -jar java/SanTakuF.jar
Icon=ledpurple
[Desktop Entry]
グループ名ですが普通はこれひとつ最初に置きます。
Type=Application
アプリケーションのランチャであることを示します。
Name=SanTakuF
アイコンに伴って表示される名前です。ランチャであると認識されると本来のファイル名はGUIでは見えなくなります。
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 と書かないと発見してもらえません。

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= という行を追加しました。

ファイル名 SanTakuF.desktop

[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;

もくじ


Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Feb.2009
Oct.2011