jarコマンドを使ってjarファイル、warファイルを作る方法

#jarコマンドでjarファイル、warファイルを作る方法

メモしておきます。
サンプルを作った環境はWindows 10です。

##jarファイルを作る方法

サンプルのソースファイルは以下の通り。

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

ディレクトリ構造は以下の通り。classesフォルダーにはコンパイル後に.classファイルが配置されます。META-INF配下にはjarに取り込むマニュフェストファイルを配置しています。

```
C:\jarファイル作成サンプル>tree /F
フォルダー パスの一覧:  ボリューム OS
ボリューム シリアル番号は XXXX-XXXX です
C:.
├─classes
├─META-INF
│      MANIFEST.MF
│
└─src
    └─sample
            App.java
```

マニュフェストファイルにはjarを実行した時にmainメソッドが実行されるJavaクラスを指定してます。

```MANIFEST.MF
Main-Class: sample.App
```

それでは、jarを作成する前にコンパイルを行いましょう。javacコマンドでコンパイルを行います。
`-sourcepath`でソースファイルが配置されているフォルダを指定します。
`-d`でコンパイル後のファイルが配置されるフォルダを指定します。

```
javac -sourcepath src -d classes src\sample\App.java
```

コンパイルを行うとclassesフォルダの配下に.classファイルが作成されます。

```
C:\jarファイル作成サンプル>tree /F
フォルダー パスの一覧:  ボリューム OS
ボリューム シリアル番号は XXXX-XXXX です
C:.
├─classes
│  └─sample
│          App.class
│
├─META-INF
│      MANIFEST.MF
│
└─src
    └─sample
            App.java
```

次にjarコマンドを使ってjarファイルを作成します。
`m`でjarファイルに取り込むマニュフェストファイルを指定してます。
`-C`で指定したフォルダの配下が圧縮され、jarファイルに取り込まれます。

```
jar cvfm sample.jar META-INF\MANIFEST.MF -C classes .
```

作成されたjarファイルの構成は以下の通りとなります。

```
C:\jarファイル作成サンプル>jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/App.class
```

実行結果は以下の通りです。

```
C:\jarファイル作成サンプル>java -jar sample.jar
Hello World!
```

##warファイルを作る方法

サンプルのソースファイルは以下の通り。

```java:SampleServlet.java
package sample;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/sample")
public class SampleServlet extends HttpServlet {
	
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html");
		resp.setCharacterEncoding("UTF-8");
		ServletOutputStream out = resp.getOutputStream();
		out.println("Hello World!");
		out.flush();
	}
}
```

ディレクトリ構造は以下の通り。WebContent\WEB-INF\classesフォルダーにはコンパイル後に.classファイルが配置されます。lib配下には上記ソースファイルをコンパイルするために必要なライブラリを配置しています。

```
C:\warファイル作成サンプル>tree /F
フォルダー パスの一覧:  ボリューム OS
ボリューム シリアル番号は XXXX-XXXX です
C:.
├─lib
│      javax.servlet-api-3.1.0.jar
│
├─src
│  └─sample
│          SampleServlet.java
│
└─WebContent
    └─WEB-INF
        └─classes
```

それでは、warを作成する前にコンパイルを行いましょう。javacコマンドでコンパイルを行います。
`-sourcepath`でソースファイルが配置されているフォルダを指定します。
`-classpath`でライブラリを指定しています。`*`を使用することでlibフォルダ配下の全てのファイルを指定できます。
`-d`でコンパイル後のファイルが配置されるフォルダを指定します。

```
javac -sourcepath src -classpath lib\* -d WebContent\WEB-INF\classes src\sample\SampleServlet.java
```

コンパイルを行うとWebContent\WEB-INF\classesフォルダの配下に.classファイルが作成されます。

```
C:\warファイル作成サンプル>tree /F
フォルダー パスの一覧:  ボリューム OS
ボリューム シリアル番号は XXXX-XXXX です
C:.
├─lib
│      javax.servlet-api-3.1.0.jar
│
├─src
│  └─sample
│          SampleServlet.java
│
└─WebContent
    └─WEB-INF
        └─classes
            └─sample
                    SampleServlet.class
```

次にjarコマンドを使ってwarファイルを作成します。
`-C`で指定したフォルダの配下が圧縮され、warファイルに取り込まれます。

```
jar cvf sample.war -C WebContent .
```

作成されたwarファイルの構成は以下の通りとなります。

```
C:\warファイル作成サンプル>jar tf sample.war
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/sample/
WEB-INF/classes/sample/SampleServlet.class
```

作成されたwarファイルをTomcat等にデプロイしてブラウザからアクセスすると`Hello World!`と表示されます。