jarファイルの作り方
 

jarファイルってよく聞くけど自分で作ったことありますか?

jarファイルは、Javaのクラスやパッケージを一つのファイルにまとめたものです。
この節は次のような内容です。
1.jarファイルの一番簡単な作り方
2.jarファイルの中身
3.jarファイルを使った実行
4.マニフェストファイルとパッケージの追加
5.jarファイルを直接実行(ダブルクリックもOK)
6.JavaBeansの格納

1. jarファイルの一番簡単な作り方

今仮に次のようなディレクトリ構成だとします。
C:\Source\Java\jartest
┗━kimura
┣━HelloKimura.class
┣━HelloKimura.java
┗━yoshino
┣━━━━IloveYoshino.class
┗━━━━IloveYoshino.java
kimuraというディレクトリの中には、HelloKimuraクラスがあり、 yoshinoの中にはIloveYoshinoというクラスがあります(Javaソースも置いてあります)。
パッケージとしてはkimurakimura.yoshinoの2つがあることになります。

HelloKimura.java
package kimura;

import kimura.yoshino.*;

/**
 *  木村佳乃に会ってみたい....
 *  @author YTP
 */
public class HelloKimura {
    public static void main(String[] args) {
        IloveYoshino ilove = new IloveYoshino();
        
        ilove.you();
    }
}
                            
IloveYoshino.java
package kimura.yoshino;

/**
 *  佳乃ちゃーん
 *  @author YTP
 */
public class IloveYoshino {
    /**
     *  君は何もしなくていいよ、愛さえあれば
     */
    public IloveYoshino() {
    }
    
    /**
     *  現実にならんかなぁ
     */
    public void you() {
        System.out.println("YTPさん大好き!!");
    }
}
                            
さっそくjarファイルを作ってみます。
jarファイルの一番簡単な作り方
C:\Source\Java\jartest>jar cvf yoshino.jar kimura
マニフェストが追加されました。
kimura/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
kimura/HelloKimura.class を追加中です。(入 = 348) (出 = 262)(24% 収縮されました)

kimura/HelloKimura.java を追加中です。(入 = 272) (出 = 193)(29% 収縮されました)
kimura/yoshino/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
kimura/yoshino/IloveYoshino.class を追加中です。(入 = 431) (出 = 317)(26% 収縮さ
れました)
kimura/yoshino/IloveYoshino.java を追加中です。(入 = 336) (出 = 225)(33% 収縮さ
れました)

C:\Source\Java\jartest>
                        

jarコマンドは、UNIXのtarコマンドに似せて作られています。 Windowsしか知らない人にはちょっとなじみが薄いコマンドですね。
jarの後ろはオプションです。
  • c はjarファイルを新規作成する
  • v は詳細な情報を画面に出力する
  • f はjarファイル名を指定する
という意味です。
コマンドの一番最後にはjarファイルの中に入れたいクラスファイルやディレクトリを指定します。 スペースで区切って複数指定することができます。
コマンドを実行すると、yoshino.jarが作成されます。

2. jarファイルの中身

tというオプションを指定すると出来上がったjarファイルの中を見ることが出来ます。
jarファイルの中を覗いちゃおう
C:\Source\Java\jartest>jar tvf yoshino.jar
     0 Sat Dec 22 23:29:26 JST 2001 META-INF/
    71 Sat Dec 22 23:29:26 JST 2001 META-INF/MANIFEST.MF
     0 Sat Dec 22 22:54:36 JST 2001 kimura/
   348 Sat Dec 22 22:54:36 JST 2001 kimura/HelloKimura.class
   272 Sat Dec 22 22:54:28 JST 2001 kimura/HelloKimura.java
     0 Sat Dec 22 23:29:06 JST 2001 kimura/yoshino/
   431 Sat Dec 22 22:54:36 JST 2001 kimura/yoshino/IloveYoshino.class
   336 Sat Dec 22 22:57:16 JST 2001 kimura/yoshino/IloveYoshino.java

C:\Source\Java\jartest>
                        
おやっ? 元々のディレクトリにはなかったディレクトリとファイルが見えますね。 META-INFMANIFEST.MFです。
これはjarコマンドによって追加されたもので、マニフェストファイルと言います。 マニフェストファイルにはメタ情報と呼ばれるものが記述されます。 このファイルの役割は後程説明します。

jarファイル自体はZIP形式なので、通常のアーカイバでも中身を確認出来ます。 当然ですが、jarファイルの展開もアーカイバで可能です。
すけすけのyoshinoちゃん

3. jarファイルを使った実行

では、出来上がったjarファイルを使ってさっそく実行してみましょう!!
天にも昇る心地ぃ〜
C:\Source\Java\jartest>java -cp yoshino.jar kimura.HelloKimura
YTPさん大好き!!

C:\Source\Java\jartest>
                        

上記では*.javaファイルも一緒にjarの中に格納しましたが、 実行するだけならば*.classファイルだけを格納すれば充分です。
ソースファイルもに配布したいような場合は上記のように一緒に格納すると便利ですよね。

4. マニフェストファイルとパッケージの追加

皆さんは、JDBCドライバやサーブレットサーバが提供するjarファイルを CLASSPATH環境変数に追加して使うのはよくやりますよね?
でもjarファイルは直接実行するのにも使えるって知ってますか?
先程出て来たマニフェストファイルを使うと、実行出来るjarファイルを作ることが可能です。
上記のパッケージに加えて次のようなものを用意します。
C:\Source\Java\jartest
┗━nishida
┣━HelloNishida.class
┣━HelloNishida.java
┗━hikaru
┣━━━━IloveHikaru.class
┗━━━━IloveHikaru.java

HelloNishida.java
package nishida;

import nishida.hikaru.*;
import javax.swing.*;

/**
 *  西田ひかるにも会ってみたい....
 *  @author YTP
 */
public class HelloNishida extends JFrame {
    public static void main(String[] args) {
        HelloNishida hikaru = new HelloNishida();
        hikaru.getYou();
        System.exit(0);
    }
    
    /**
     *  そんな日が来るのか?
     */
    public void getYou() {
        IloveHikaru ilove = new IloveHikaru();
        ilove.setMessage("二人で幸せになろう");
        JOptionPane.showMessageDialog(
            this,
            ilove.you(),
            "ひかる マイ・ラブ",
            JOptionPane.INFORMATION_MESSAGE
        );
    }
}
                            

IloveHikaru.java
package nishida.hikaru;

import java.io.*;

/**
 *  ひかるー
 *  @author YTP
 */
public class IloveHikaru implements Serializable {
    /**
     *  何か言っておくれ
     */
    private String sMessage_ = null;
    
    /**
     *  俺の心は空っぽ
     */
    public IloveHikaru() {
    }
    
    /**
     *  幸せになりたい...
     *  @param 愛のメッセージ
     */
    public void setMessage(String sMessage) {
        sMessage_ = sMessage;
    }
    
    /**
     *  俺を喜ばせる言葉は...
     *  @return 何か言っておくれ
     */
    public String getMessage() {
        return sMessage_;
    }
    
    /**
     *  嘘でもいいから言って欲しいなぁ
     */
    public String you() {
        return "YTPさん" + sMessage_;
    }
}
                            

次にマニフェストファイルを作ります。まず、エディタを開いて次のように入力して下さい。
マニフェストってフェミニスト?
Main-Class: nishida.HelloNishida
                        
この1行だけでOKです。:(コロン)の後ろにはスペースを必ず入れて下さい。 これをhikaru.maniという名前でC:\Source\Java\jartestディレクトリに保存します。

さて、新しく作ったパッケージを先程のyoshino.jarに追加します。
jarコマンドのuオプションを使うとパッケージやクラスの追加が出来ます。
佳乃とひかるの合体っ!!
C:\Source\Java\jartest>jar uvfm yoshino.jar hikaru.mani nishida
マニフェストが更新されました。
nishida/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
nishida/HelloNishida.class を追加中です。(入 = 762) (出 = 528)(30% 収縮されまし
た)
nishida/HelloNishida.java を追加中です。(入 = 647) (出 = 398)(38% 収縮されました
)
nishida/hikaru/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
nishida/hikaru/IloveHikaru.class を追加中です。(入 = 669) (出 = 410)(38% 収縮さ
れました)
nishida/hikaru/IloveHikaru.java を追加中です。(入 = 768) (出 = 375)(51% 収縮され
ました)

C:\Source\Java\jartest>
                        
オプションのうちmというのはマニフェストファイルを指定するものです。
このオプションを指定する時の注意点は、fオプションとの順番です。 上記例ではfmという順序でオプション指定したので、 その後ろに続くファイルもjarファイル マニフェストファイルの順で指定する必要があります。

jarファイルの中がどうなったか確認してみましょう。
シースルーのyoshinoちゃん
C:\Source\Java\jartest>jar tvf yoshino.jar
     0 Mon Dec 24 01:45:40 JST 2001 META-INF/
   105 Mon Dec 24 01:46:56 JST 2001 META-INF/MANIFEST.MF
     0 Sat Dec 22 22:54:36 JST 2001 kimura/
   348 Sat Dec 22 22:54:36 JST 2001 kimura/HelloKimura.class
   272 Sat Dec 22 22:54:28 JST 2001 kimura/HelloKimura.java
     0 Sat Dec 22 23:29:06 JST 2001 kimura/yoshino/
   431 Sat Dec 22 22:54:36 JST 2001 kimura/yoshino/IloveYoshino.class
   336 Sat Dec 22 22:57:16 JST 2001 kimura/yoshino/IloveYoshino.java
     0 Mon Dec 24 01:46:14 JST 2001 nishida/
   762 Mon Dec 24 01:44:52 JST 2001 nishida/HelloNishida.class
   647 Mon Dec 24 01:44:50 JST 2001 nishida/HelloNishida.java
     0 Mon Dec 24 01:46:10 JST 2001 nishida/hikaru/
   669 Mon Dec 24 01:43:02 JST 2001 nishida/hikaru/IloveHikaru.class
   768 Mon Dec 24 01:43:00 JST 2001 nishida/hikaru/IloveHikaru.java

C:\Source\Java\jartest>
                        
夜な夜な阿保なプログラムを作ってホームページにしているのがまるわかりですね(^_^;

5. jarファイルを直接実行(ダブルクリックもOK)

今度は実行してみます。
ひかるに会えるか?
C:\Source\Java\jartest>java -jar yoshino.jar

C:\Source\Java\jartest>
                        
昇天.....
今回はjarファイル名だけを指定していますよね? それだけでHelloNishidaクラスのmainメソッドがちゃんと呼ばれているのがわかりますか?
理由は、先程マニフェストに追加した1行です。 Main-Class: は、jarファイルの中のmainメソッドを呼ぶクラスを指定しているんです。
jarファイルの中にあるMANIFEST.MFファイルの中を見てみましょう。
MANIFEST.MF
Manifest-Version: 1.0
Main-Class: nishida.HelloNishida
Created-By: 1.3.1_01 (Sun Microsystems Inc.)
                        
先程hikaru.maniに記述した内容がこのファイルに転記されています。
実はこのマニフェストファイルがあるおかげで、 yoshino.jarはダブルクリックしただけでも実行出来るんです。

6. JavaBeansの格納

IloveHikaruクラスはSerializableを実装(implements)していますね。 これはJavaBeansにしたかったからなんです。
jarファイルの中にJavaBeansを配置したい場合は、マニフェスト(hikaru.mani)に次のように記述します。
hikaru.mani
Main-Class: nishida.HelloNishida
Name: nishida.hikaru.IloveHikaru
Java-Bean: true
                        

jarコマンドを実行します。
マニフェストの行進いや更新
C:\Source\Java\jartest>jar uvfm yoshino.jar hikaru.mani
マニフェストが更新されました。

C:\Source\Java\jartest>
                        

MANIFEST.MFファイルの中を再び見てみましょう。
MANIFEST.MF
Manifest-Version: 1.0
Name: nishida.hikaru.IloveHikaru
Main-Class: nishida.HelloNishida
Java-Bean: true
Created-By: 1.3.1_01 (Sun Microsystems Inc.)
                        
これでIloveHikaruクラスはJavaBeansとして使用出来ます。

jarコマンドマニフェストファイル の詳細はJava2 SDKドキュメントにあるので、そちらを是非一度読んでみて下さい。


Copyright © 2002-2016, Your Technology Partner. All rights reserved.