プログラム(アプレット)が開始される時にすべてのクラスファイルが読み込まれるのではなく、必要になった時にダウンロードされます。
つまりTestクラスとTestComponentクラスという2つのクラスからなるプログラムの場合、まずTestクラスがダウンロードされ実行されます。その中で、例えば[new TestComponent()]なんて書いてあると、それを実行する際にTestComponent.classファイルがネットワークからダウンロードされるのです。ですから、プログラム実行中にダウンロードする時間だけプログラムの流れが止まってしまうと言うことになります。
また、大きなプログラムになってくるとたくさんのクラスファイルができてきてフォルダ(ディレクトリ)の中がごちゃごちゃになってきてしまいます。
これを回避するためにjarファイルという物が使われます。これは圧縮ファイルです。つまり複数のクラスファイルや画像ファイルを圧縮して1つのファイルにしてしまうと言う物です。実際はzipファイルという圧縮ファイルとほぼ同じフォーマットとなっており、slideshowapplet.jarというjarファイルがあった場合、slideshowapplet.zipとして汎用の解凍ソフトを使用すれば解凍することが可能ですし、逆にコマンドラインからjarファイルを作る(方法は後述します)のは面倒なので汎用の圧縮ソフトでzipファイルにしても、そのままjavaで使用することが可能です。
ではzipファイルとjarファイルは何が違うかというと、jarでは悪意あるプログラムが入っていないと言うことを署名するマニフェストを埋め込むことが可能なことです。有効なマニフェストが含まれていると、他のサーバーと通信できないと行ったJavaAppletの制限を取り除くことも可能ですが、ここでは説明しません。
ここでは簡単なjarファイルの作り方と、使い方を説明します。
C:\java\>jar cf myapplets.jar Test.class
Test.classをmyapplets.jarというjarファイルにする
C:\java\>jar cf myapplets.jar Test*.class
Testで始めるすべてのclassファイルをmyapplets.jar
というjarファイルにする
C:\java\>jar cf myapplets.jar *.class *.jpg
このフォルダ内にあるすべてのクラスファイルとjpg
ファイルをmyapplets.jarというjarファイルにする
C:\java\>jar cf myapplets.jar *.class image
このフォルダ内にあるすべてのクラスファイルとimage
というフォルダ内の全ファイルをmyapplets.jarという
jarファイルにする |
jarの後のcfのcはアーカイブファイルを新規に作成するという意味で指定したjarファイルが存在する時は上書きします。
fはアーカーイブファイル名をユーザーが指定する場合につけるオプションです。ほかにvをつけると圧縮率などが表示されるのでよく使われるオプションです。
C:\java\>jar tf myapplets.jar
META-INF/MANIFEST.MF
Test.class
C:\java\>jar tvf myapplets.jar
154 Fri Jan 26 23:55:16 JST 2007 META-INF/MANIFEST.MF
1360 Mon Jan 22 03:05:56 JST 2007 Test.class
C:\java>
|
jarのオプションにtをつけるとjarファイルの中身を表示させると言うことになります。ここでもvをつけると詳細が表示されます。
C:\java\>jar xf myapplets.jar
C:\java>
|
xオプションをつけると、中に格納されているファイルを解凍します。
java1.2からだったか、uオプションが追加されました。これは既存のjarファイルに新たにファイルを追加する時に使いますが、本サイトではjava1.1を対象にしていますので、説明は割愛します。
次にhtml内の<Applet>タグの書き方です。これまで下記のように書いていました。
<applet code="TestApplet" width=300 height=100>
<param name="COLOR" value="FF00CC">
</applet> |
TestAppletクラスはtest.jarに格納されている場合は下記のように書きます。
<applet code="TestApplet" archive="test.jar" width=300 height=100>
<param name="COLOR" value="FF00CC">
</applet> |
jarファイルではなく、下記のようにjarファイルではなくzipファイルも使えます。
<applet code="TestApplet" archive="test.zip" width=300 height=100>
<param name="COLOR" value="FF00CC">
</applet> |
jarファイルをhtmlファイルとは違う場所、例えばappletsというサブフォルダに入れたい場合は下記のようにします。
<applet code="TestApplet" codebase="applets" archive="test.jar" width=300 height=100>
<param name="COLOR" value="FF00CC">
</applet> |
サブフォルダのさらにサブフォルダに入れることは可能ですが、htmlファイルよりも上のフォルダや他のサーバーには入れられません。つまり、codebase="applets/subfolder"はOKですが、codebase="../applets"はダメです。
ところでAppletクラスのgetDocumentBaseは、あくまでもhtmlファイルのフォルダを返します。ですから
Image image = getImage(getDocumentBase(), "image.jpg");
と書く場合、htmlファイルと同じフォルダにあるimage.jpgを探します。image.jpgファイルを含むjarファイルをapplets
フォルダに入れる場合は、
Image image = getImage(getDocumentBase(), "applets/image.jpg");
と書く必要がありますので注意が必要です。
Imageでは画像が実際に読み込まれるのはdrawImageなど、実際に使用される時だと言うことを説明しました。したがってネットワークが遅い場合などはすぐに画面に表示しないことがあることも説明しました。これを回避するためには、ImageObserverを使用して、画像が取得されるのを待ってから表示させるようにすることも可能ですが、そうするとプログラムが面倒になります。そこで、jarファイルにしてしまえば、最初にすべてのファイルがダウンロードされますので、画像の読み込みも早くなります。