JDKのbinフォルダに入っているツールをまとめてみた


### シリーズ一覧
第１回：JDKのbinフォルダに入っているツールをまとめてみた
第２回：[JDKのbinフォルダに入っているツールをまとめてみた　〜 セキュリティ](http://qiita.com/chooyan_eng/items/e11761b6822ee9a2589a)
第３回：[JDKのbinフォルダに入っているツールをまとめてみた　〜 国際化](http://qiita.com/chooyan_eng/items/68d7d5c910622e6f188a)

***

JDKってサイトから落としてきてパスを通すくらいで、中身をじっくり見たことないなー、、、
ということで、JDK の bin フォルダの中に含まれているツールたちについて、少し調べてみたのでまとめます。

基本的には、以下の公式リファレンスのまとめのような感じです。

[Java Platform, Standard Editionツール・リファレンス](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/toc.html)

※上記ページの「Javaアプリケーションの作成と構築」に始まり「セキュリティ」「国際化」「RMI」等、全てのツールをこの記事でまとめようと思ったのですが、ちょっと時間がかかりすぎるのと、記事が長くなりすぎるので、今回は「Javaアプリケーションの作成と構築」の項目のみ記載します。

# Javaアプリケーションの作成と構築
## appletviewer

appletviewerはWebブラウザを使わずにAppletの動作確認ができる開発ツールです。

Appletは通常Webブラウザ上で動作しますが、Appletプログラムをブラウザ上で動作させるには、WebブラウザがJavaを読み込めるようJREをインストールする必要があったり、ブラウザのキャッシュ等の設定を気にしなければならなかったり、なにかとブラウザの事情で開発がうまく進められないことがあります。

開発時はこのツールを使うことによって、ブラウザの事情に左右されることなく自分のプログラムの動作確認ができます。

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/appletviewer.html

## extcheck
JREの lib/ext ディレクトリ内に含まれる拡張機能JARファイルと、実行時に指定した同名のJARファイルのバージョンの競合状況をチェックするツールです。

詳しい使い方や使いどころはちょっと調べられず。。。以上です。
どなたか詳しい方いらっしゃいましたらコメントいただけるととても助かります！

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/extcheck.html

## jar
これはよく使いますね。Javaのアーカイブ（JAR）を作成したり更新したりするためのツールです。

例： dest/jp/co/chooya ディレクトリ内にある全てのクラスファイルをアーカイブし、test.jarファイルを作成

```
$ jar cf test.jar dest/jp/co/chooyan/*.class
```

アーカイブを作成する際のオプションによって、デフォルトのmainクラスを設定したり（e）、実行時のJVMオプションを設定できたり（-Joption）します。

__参考__
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jar.html

## java
こちらも説明の必要は無いかと思います。
コンパイルされた.classファイルをJVM上で実行するためのコマンドです。

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html

## javac
Javaのソースファイルをコンパイルし、.classファイルを生成するためのコマンドです。
Eclipse等のIDEを使っているとあまり目にする機会はないかもしれませんが、コマンドラインでJavaをコーディングして実行する際には必ず必要になるコマンドです。

例：jp/co/chooyanディレクトリの全てのJavaファイルと、関連するJavaファイルをコンパイルし、生成されたクラスファイルを bin ディレクトリに保存

```
$ javac -d bin jp/co/chooyan/*.java
```

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javac.html#BHCBDCJI

## javadoc
ソースコード内に記載されたjavadocを読み取り、HTMLのAPIリファレンスページを作成します。
ちゃんとjavadocを書いておくと、[Java API リファレンス](http://docs.oracle.com/javase/jp/8/docs/api/)のようなきれいなHTMLページで出力してくれるので、結構便利です。

例： jp/co/chooyan/ディレクトリ内の全てのjavaファイルのjavadocページを作成する

```
$ javadoc jp.co.chooyan jp/co/chooyan/*.java
```

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javadoc.html#CHDIBDDD

## javah
JavaのソースコードからC言語のヘッダファイルを生成します。
JNIを使ったC言語のプログラムとの連携の際に使用され、

1. Javaで、C言語で実装するプログラムのインターフェイスを定義
2. javah によってC言語のヘッダファイルを生成
3. 生成されたヘッダファイルに従ってC言語で実装
4. C言語のソースファイルをコンパイル
5. JavaからC言語の実装を呼び出し

という感じで使うようです。

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javah.html

## javap
コンパイル済みのクラスファイルを逆アセンブルするツールです。

例：jp.co.chooyan.Personクラスを逆アセンブルする

```
$ javap bin/jp/co/chooyan/Person.class
Compiled from "Person.java"
public class jp.co.chooyan.Person {
  public jp.co.chooyan.Person(java.lang.String, int);
  public java.lang.String getName();
  public void setName(java.lang.String);
  public int getAge();
  public void setAge(int);
}
```

-vオプションを付けるとさらに詳細な情報が出力されます。

### 参考

* https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javap.html
* [Javaのクラスファイルをjavapとバイナリエディタで読む](http://dev.classmethod.jp/server-side/java/classfile-reading/)
    * 逆アセンブルによって出力された内容の読み方はこちらの記事がとても勉強になります。


## jdb
Javaプログラムをデバッグ実行するためのツールです。
普段はEclipse等、統合開発環境のデバッグツールを使うことが多いのですが、実はコマンドライン上でもこのツールを使用することでデバッグが可能です。

例：jp.co.chooyan.MainExecutor をデバッグ実行する。

```
$ jdb -classpath bin jp.co.chooyan.MainExecutor
```

jdbを実行すると、対話形式でプログラムの進行を制御できるようになります。

統合開発環境と同じく、ステップ実行したり、ブレークポイントを張ったり、変数（プリミティブ型もオブジェクト型も）の値を出力したり、といったことがコマンドライン上で操作できます。

特にブレークポイントは「○○クラスの何行目」という指定だけでなく、「○○クラスの××メソッドの最初のステップ」のように、行数や場所がすぐにわからない場合でも狙った場所に張ることができるため、IDEで行を狙ってブレークポイントを張るよりも使いやすい場合があったりします。

### 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jdb.html


## apt
apt(Annotation Processing Tool)は、Javaソースファイルのコンパイル時に予めプログラマーが定義したアノテーションとチェックロジックに従ってソースコードをチェックするツールです。
元々はjavacのラッパーとしてJDK 5 で登場したらしいのですが、現在は逆に javac が apt を取り込む形で apt は deprecated となり、常に javac を使うようになったようです。（確かにJava8のドキュメントや bin ディレクトリには apt は出てきません）

### 参考

* http://www.javalobby.org/java/forums/t17876.html
    * そもそもaptとは、みたいなところが分かりやすく書かれています。2002年の、aptが廃止される前の記事ではありますが、コンパイル時にチェックするタイプのアノテーションを理解するのに有用だと思うので、リンクを載せておきます。
* http://docs.oracle.com/javase/7/docs/technotes/guides/apt/
    * Java7のドキュメントに書かれている apt の説明です。廃止された旨もここに書いてあります。



# まとめ
調べてみて、IDEやサードパーティのツールだけでなく、Oracleからデフォルトで提供されているツールの中にも使えるものがあったり、おまじないのように使っていたコマンドの役目が分かったりと、いろいろと発見がありました。

中には自分の開発分野では絶対に使わなそうなものもあったりしましたが（applet関連のツールとか）、引き出しとして知っておくだけでも何かの役に立つかな、という漠然とした感想です。

引き続き、他のツールについても調べてまとめたいと思います。

* 第２回 [JDKのbinフォルダに入っているツールをまとめてみた　〜 セキュリティ](http://qiita.com/chooyan_eng/items/e11761b6822ee9a2589a)