Java

JARファイル入門

本文では初学者用(自分用)に、JARファイルの作成から使用までをまとめていきたいと思います。

JARファイルは複数のJavaのクラスやパッケージを一つのファイルにまとめたものです。
これを作成するには、jarコマンドを用いるのが良いです。jarコマンドはJDKをPCにインストールしていれば使用できます。

1. 今回の開発環境

以下の条件で、jarファイルを作成していきます。

・マシン: MacBook Air 2017
・OS: macOS High Sierra(10.13.3)
・Javaバージョン: 9.0.4

また本来JARファイルは複数のJavaのクラスやパッケージを一つのファイルにまとめる際に便利なものなのですが、今回は簡単の為に、パッケージもクラスも一つのみを取り扱います。

2. JARファイルにまとめるJavaクラスの作成

まず今回の例に使用するTest.java~/Documents/test/の中に作成します。
test/は自身で作成しました。
以下は作成したクラスの内容です。

Test.java
package test;

public class Test {
 public static void main(String args[]){
    System.out.println("Hello World!");
  }
}

JARファイルは.javaファイルではなく.classファイルを使用するので、javacコマンドでコンパイルする必要があります。

test username$ javac Test.java

今回はパッケージ指定しているので、このプログラムをjavaコマンドで実行して結果を確認する為には、test/ディレクトリではなくDocuments/ディレクトリで以下のコマンドを実行する必要があります。

Documents username$ java test.Test
Hello World!

これで~/Documents/test/のなかに、Testクラスが作成されました。

3. JARファイルを作成

続いてjarコマンドでJARファイルを作成します。
jarコマンドについてはこちらのサイトにオプションなども含めて詳しく書いてあります。

では早速以下のjarコマンドでJARファイルを作成しましょう。

Documnets username$ jar cvf Test.jar test/

オプションの内訳としては

・c: JARファイルを新規作成する
・v:詳細な情報を画面に出力する
・f:JARファイル名を指定する

です。

つまり

Documnets username$ jar cvf [新規作成するJARファイルの名前] [JARファイルに含めたいJava
プログラムが入っているディレクトリ]

というふうになっています。
このコマンドを実行した後以下のコマンドを実行するとこのような感じの結果が表示されるはずです。

Documents username$ jar tvf Test.jar
     0 Wed Jan 31 16:20:16 JST 2018 META-INF/
    88 Wed Jan 31 16:22:12 JST 2018 META-INF/MANIFEST.MF
     0 Wed Jan 31 15:06:50 JST 2018 test/
   419 Wed Jan 31 16:06:06 JST 2018 test/Test.class
   122 Wed Jan 31 15:06:50 JST 2018 test/Test.java

これでJARファイルは作成されました。

4. JARファイルにメイン・マニフェスト属性を追加

早速JARファイルをjava -jarコマンドを用いて実行してみましょう。
そうすると

Documents username$ java -jar Test.jar
Test.jarにメイン・マニフェスト属性がありません

というような結果が出力されるはずです。
これは、java -jarで実行された時に呼び出されるMainメソッドは、どのクラスのMainメソッドなのかを設定していないために起こります。

これが起こらないようにMANIFEST.MFにメイン・マニフェスト属性を追加してあげる必要があります。
追加の方法としては、.maniというマニフェストファイルを、JARファイルが存在するディレクトリに作成したあと、そのファイルの中に以下のような内容を記述します。

Main-Class: test.Test

内訳としては、Test.classが所属しているパッケージの後に、呼びだしたいMainメソッドを保有しているクラス名を記述します。
今回はTest.javapackage test;と書いたのでtestTest.classが所属しているパッケージです。

このようにしてマニフェストファイルを作成した後、以下のコマンドを実行します

Documents username$ jar uvfm Test.jar Test.mani

これでMANIFEST.MFの中にメイン・マニフェスト属性が追加されました。
MANIFEST.MFの内容を確認してみると以下のようになっていると思います。

Manifest-Version: 1.0
Created-By: 9.0.4 (Oracle Corporation)
Main-Class: test.Test 

5. JARファイルを実行

ここまでくれば、java -jarコマンドでJARファイルを実行出来ると思います。

Documents username$ java -jar Test.jar
Hello World!

もしかしたらクラスパスを指定しないと実行できない場合があるかもしれません。
そういう時は、~/.profileに以下の文を追加します(ファイルがなかったら作成してください)

export CLASS_PATH=/Users/username/Documents/Test.jar

以上がJARファイルの基本です。
自分もまだまだ初学者なので、コメントでの本文に対するご指摘など、是非お願いします!