jar (Java Archive) は tar コマンドのようにファイルをアーカイブする JAVA のコマンドです。簡単に使用方法をまとめます。jar コマンドを利用するためには Oracle のページから JDK をダウンロードおよびインストールして PATH を通しておく必要があります。
基本的な使用方法
sample/HelloWorld.java
package sample;
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
コンパイルしておきます。
$ javac sample/HelloWorld.java
ディレクトリ構成は以下の通りです。
.
└── sample
├── HelloWorld.class
└── HelloWorld.java
実行例
$ java sample.HelloWorld
Hello World!
エントリーポイントのある実行可能な jar を作成
エントリーポイントとなる class ファイルを指定すれば実行可能な jar が生成できます。jar 生成時にマニフェスト情報が記載されたファイルを引数で指定することで情報を取り込めます。ファイル名は何でもよいですが、例えば Manifest.txt としてみます。
.
├── Manifest.txt
└── sample
├── HelloWorld.class
└── HelloWorld.java
Manifest.txt
Main-Class: sample.HelloWorld
以下のコマンドで jar を生成します。
$ jar cvfm sample.jar Manifest.txt sample
オプションの意味は以下の通りです。
-c jar を新規作成する
-v 標準出力に詳細な出力を生成する
-f jar ファイル名を指定する
-m 指定のマニフェスト・ファイルからマニフェスト情報を取り込む
成果物 jar を実行してみます。
$ java -jar sample.jar
Hello World!
jar ファイルの中身を閲覧
「-t アーカイブの内容を一覧表示する」を利用します。
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java
jar ファイルを展開
「-x ファイルをアーカイブから抽出する」を利用します。
$ jar xvf sample.jar
以下のように展開されます。
.
├── META-INF
│ └── MANIFEST.MF
├── sample
│ ├── HelloWorld.class
│ └── HelloWorld.java
└── sample.jar
先程取り込んだマニフェスト情報が追加されています。
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.7.0_75 (Oracle Corporation)
Main-Class: sample.HelloWorld
エントリーポイントのない実行不可能な jar を作成
マニフェスト情報を取り込むためのファイルを指定しなければよいです。
$ jar cvf sample.jar sample
$ java -jar sample.jar
sample.jarにメイン・マニフェスト属性がありません
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java
そもそもマニフェストファイルを生成しないようにするためには M オプションを利用します。
$ jar cvfM sample.jar sample
$ jar tf sample.jar
sample/
sample/HelloWorld.class
sample/HelloWorld.java
jar にファイルを追加する
「-u 既存アーカイブを更新する」オプションを利用します。
$ jar uvf sample.jar Append.class
$ jar tf sample.jar
sample/
sample/HelloWorld.class
sample/HelloWorld.java
Append.class
カレントディレクトリを指定する
「-C 指定のディレクトリに変更し、以下のファイルを取り込む」オプションを利用することでカレントディレクトリを変更できます。
.
└── sample
├── HelloWorld.class
└── HelloWorld.java
ルートに HelloWorld.class などが直接配置されています。
$ jar cvf sample.jar -C sample .
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class
HelloWorld.java
比較のために -C を利用しない場合の例を示します。
$ jar cvf sample.jar sample
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java
応用例
.
└── sample
└── HelloWorld.java
sample/HelloWorld.java
package sample;
public class HelloWorld {
public static void print() {
System.out.println("Hello World!");
}
}
コンパイルして jar にまとめます。
$ javac sample/HelloWorld.java
$ jar cvf sample.jar sample
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java
jar を別の java ファイルで利用する
Main.java
import sample.HelloWorld;
class Main {
public static void main(String args[]) {
HelloWorld.print();
}
}
ディレクトリ構成
.
├── Main.java
└── sample.jar
以下のように Main.java のコンパイルおよび実行ができます。
$ javac -classpath ./sample.jar Main.java
$ java -classpath '.;./sample.jar' Main
Hello World!
環境変数 CLASSPATH を利用すればオプション classpath は不要になります。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...