コマンドでjarファイルを作成します

全部コマンドで、Javaファイルからクラスにコンパイルします。そしてJarファイルを作成します

#Jarファイルとは
Jarについては、ウィキで説明は以下です。
Jar（ジャー）またはJava Archive（ジャバ アーカイブ）とは、コンパイルされた複数のJavaバイトコード及びそれが使用する画像などのリソースを一つにまとめZip形式で圧縮されたファイル、及びそれを出力するツールのこと。

#準備
**ディレクトリ準備**
Jarのディレクトリ構造は以下の通りで、必要に応じてディレクトリを作成します。

```
mkdir jar_compile01
cd jar_compile01
mkdir classes
mkdir -p src/com/demo
mkdir MATE-INFO
```
classesディレクトリは、コンパイルされたクラスがここに生成されています。
MATE-INFOディレクトリは、拡張機能およびパッケージ関連のデータの定義に使うマニフェストファイルがここに配置されています。

**ソースコード準備**
src/com/demoの配下にJavaファイルを作ります。

```
# App.java
package com.demo;
public class App {
    public static void main(String[] arg) {
        System.out.println("Hello World!");
    }
}
```

**マニフェストファイル準備**
MATE-INFOの配下にマニフェストファイルを作ります。

```
# MANIFEST.MF
Main-Class: com.demo.App
```


#クラスコンパイル
Javaをコンパイルしてクラスを作成します。

```
javac -sourcepath src -d classes src/com/demo/App.java
```

コンパイルを行うとclassesディレクトリの配下にクラスが作成されます。

<font color=skyblue>■ javacのオプション</font>

|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|説明|
|:------|:--------|
|-classpath       |ユーザクラスパスを設定し、CLASSPATH 環境変数のユーザクラスパスを上書きします。CLASSPATH と -classpath のどちらも指定されていない場合、ユーザクラスパスは現在のディレクトリになります。詳細は、「クラスパスの設定」を参照してください。|
|-sourcepath      |オプションが指定されていない場合は、クラスファイル同様、ソースファイルもユーザクラスパスで検索されます。|
|-d  directory    |クラスファイルの出力先ディレクトリを設定します。クラスがパッケージの一部である場合、javac は、必要に応じてディレクトリを作成し、パッケージ名を反映したサブディレクトリにクラスファイルを置きます。例えば、-d ./classes と指定し、クラスの名前が com.demo.App である場合、クラスファイルは ./classes/com/demo/App.class になります。<br>-d が指定されていない場合、javac はソースファイルと同じディレクトリにクラスファイルを置きます。<br>-d で指定されたディレクトリがユーザクラスパスに自動的に追加されるわけではないことに注意してください。|
|-encoding        |ソースファイルのエンコーディング名 (EUCJIS/SJIS など) を指定します。-encoding が指定されていない場合は、プラットフォームのデフォルトコンバータが使われます。|
|-g               |局所変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号およびソースファイル情報だけが生成されます。|
|-g:none          |デバッグ情報は生成されません。|
|-g:{keyword list}|コンマで区切られたキーワードリストにより指定された、特定の種類のデバッグ情報だけを生成します。 次のキーワードが有効です。|
|source           |ソースファイルのデバッグ情報|
|lines            |行番号のデバッグ情報|
|vars             |局所変数のデバッグ情報|
|-nowarn          |警告メッセージを表示しません。|
|-O               |注: -O オプションを指定しても、javac と oldjavac の現在の実装では処理は行われません。<br>実行時のコードを最適化します。-O オプションを指定すると、コンパイル速度が低下し、作成されるクラスファイルのサイズが増大して、デバッグの困難なプログラムが生成されることがあります。<br>Java 2 SDK より前は、javac の -g オプションと -O オプションを一緒に使うことができませんでした。Java 2 SDK v1.2 では、これらのオプションを組み合わせることができますが、変数の喪失、コードの移動や喪失などの思わぬ結果になる可能性があります。-O オプションを指定しても、-depend オプションが自動的に有効になったり、-g オプションが自動的に無効になったりすることはなくなりました。|
|-sourcepath sourcepath|クラスまたはインタフェースの定義を検索するソースコードパスを指定します。ユーザクラスパス同様、ソースパスの複数のエントリはセミコロン (;) で区切ります。 ソースパスのエントリには、ディレクトリ、JAR アーカイブ、または ZIP アーカイブを指定できます。パッケージを使っている場合は、ディレクトリまたはアーカイブ内のローカルパス名がパッケージ名を反映していなければなりません。<br>ソースが見つかった場合、クラスパスで見つかったクラスは、自動再コンパイルの対象になります。|
|-verbose         |冗長出力を指定します。ロードされるクラスおよびコンパイルされるソースファイルごとに情報を出力します。|

#Jarファイルを作成
jarコマンドでjarファイルを作成します。

```
jar cvfm app.jar MATE-INFO/MANIFEST.MF -C classes .
# 以下はコマンド実行後の表示
マニフェストが追加されました
com/を追加中です(入=0)(出=0)(0%格納されました)
com/demo/を追加中です(入=0)(出=0)(0%格納されました)
com/demo/App.classを追加中です(入=421)(出=292)(30%収縮されました)
```
<font color=skyblue>■ jarのオプション</font>

|オプション|説明|
|:------|:---|
|-c     |圧縮ファイルの新規作成|
|-t     |内容の一覧を表示|
|-x     |圧縮ファイルの展開|
|-u     |jarファイルの更新|
|-v     |コマンドラインに処理内容を表示|
|-f     |jarファイル名の指定|
|-m     |マニフェストファイルを指定|
|-i     |インデックス情報を作成|
|-o     |圧縮を行わない|
|-M     |マニフェストファイルを作成しない|
|-C     |指定したファイルの取り込み|

#Jarファイルを実行
Jarファイル構成を確認します。

```
jar tf app.jar
# 以下はコマンド実行後の表示
META-INF/
META-INF/MANIFEST.MF
com/
com/demo/
com/demo/App.class
```

Jarファイルを実行します。

```
java -jar app.jar
# 以下は実行結果
Hello World!
```
<font color=skyblue>■ javaのオプション</font>

|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|説明|
|:--|:--|
|-client　　　　　　|Java HotSpot Client VM を選択します。これはデフォルトの動作です。|
|-server　　　　　　|Java HotSpot Server VM を選択します。|
|-classpath<br>-cp  |クラスファイルを探すディレクトリ、JAR アーカイブ、および ZIP アーカイブのリストを指定します。クラスパスの各エントリはコロン (:) で区切ります。<br>-classpath または -cp を指定すると、これらのオプションの値によって CLASSPATH環境変数の設定は上書きされます。<br>-classpath と -cp を使用せず、CLASSPATH も設定されていない場合、ユーザクラスパスは現在のディレクトリ (.) になります。|
|-Dproperty=value |システムプロパティの値を設定します。|
|-jar             |JAR ファイルの中にカプセル化されたプログラムを実行します。最初の引数は、スタートアップクラスの名前ではなく、JAR ファイルの名前になります。このオプションが機能するには、JAR ファイルのマニフェストに「Main-Class:classname」という形式の行を指定する必要があります。<br>classname には、アプリケーションの開始位置として機能する public static void main(String[] args) メソッドを含むクラスを指定します。<br>JAR ファイルとそのマニフェストについては、JAR ツールのページおよび Java チュートリアルの「Jar Files」を参照してください。このオプションを使用すると、指定された JAR ファイルは、すべてのユーザクラスのソースになり、ほかのユーザクラスパス設定は無視されます。<br>Solaris 8 では、"java -jar" オプションを付けて実行可能な JAR ファイルは、実行権限セットを保持しています。このため、"java -jar" を使用せずに実行することも可能です。|
|-verbose<br>-verbose:class|クラスがロードされるたびにクラスに関する情報を表示します。|
|-verbose:gc    |ガベージコレクションイベントが発生するたびに報告します。|
|-verbose:jni   |ネイティブメソッドおよびその他の Java Native Interface (JNI) の使用に関する情報を報告します。|
|-version       |バージョン情報を表示して終了します。|
|-showversion   |バージョン情報を表示して続行します。|
|-?<br>-help    |使用法を表示して終了します。|