← Spring コース
4. java・javac・jar・javap: JDK のコマンド
は、ソースの から を作るコンパイラです。 は、 を起動して .class を動かすコマンドです。 は、.class をまとめて というファイルを作り、その中を見るコマンドです。 は、.class の中身を人が読める形で表示するコマンドです。4つとも に入っています。アプリを作って動かすのに使うのは前の3つで、javap は中を確かめるための道具です。
Node と TypeScript に当てはめると、javac が tsc、java が node の位置です。jar に近いのは zip を作る道具で、JAR の中身は zip 形式です。ただし jar は、という説明書きのファイルを自動で足します。javap に当たるものはありません。tsc が出す .js はそのまま読めるからです。node にはファイル名を渡しますが、java にはの名前を渡す点も違います。
止まりやすいのはオプションです。 out は .class の出力先を、 out はクラスを探す場所を指定します。 app.jar の tf は、t(一覧)と f(次にファイル名を書く)を続けた形で、jar --list --file app.jar と同じです。javap は、何も付けないと private なものを出しません。-p で全部、-c で命令列、-v で詳しい情報が出ます。
点線の付いた語はタップすると説明が出ます。用語集を開く →
ソース(.java)src/app/Main.java と、それが使う src/lib/util/Greeter.java
javac -d out -sourcepath src src/app/Main.java
.classout/app/Main.class と out/lib/util/Greeter.class ができる
javac ↔ tsc.class を、3つの道具がそれぞれ受け取る
javajava -cp out app.Main。JVM を起動して main を呼ぶ
↔ nodejarjar --create --file app.jar --main-class app.Main -C out .。app.jar にまとめる
javapjavap -cp out lib.util.Greeter。中身を読める形で表示する
jar が作った app.jar を、また java と jar が受け取る
java -jar app.jarJAR を指定して動かす。出力は java -cp out app.Main と同じ
jar tf app.jarJAR の中のファイル名を一覧する
- ・4つとも JDK の bin フォルダに入っています。Temurin 25.0.4.1 の JDK の bin には30個のコマンドがあり、JRE の bin(6個)には java はありますが、javac・jar・javap はありません
- ・JAR は、.class などを1つにまとめた zip 形式のファイルです。マニフェストは、JAR の中に入っている説明書きのファイル(META-INF/MANIFEST.MF)で、java -jar で動かすクラスの名前(Main-Class の行)などが書かれます。どちらも次のレッスンで扱います。java -cp の「クラスを探す場所の一覧」はクラスパスと呼びます。これも後のレッスンで扱います
- ・app.Main のような点で区切った名前は、app というまとまり(パッケージ)に入った Main というクラスを指します。javac -d out は、この名前に合わせて out/app/ のようなフォルダを自分で作って .class を置きます。パッケージは後のレッスンで扱います
- ・javac に渡した1つのファイルが別のクラスを使っているときは、-sourcepath(ソースを探す場所)か -cp(.class を探す場所)で場所を教えないと、コンパイルできませんでした。失敗の実物はサンプル集にあります
- ・javap のマニュアル(JDK 25)は、説明文では「オプションなしでは protected と public のものを表示する」と書き、-package というオプションの項では「package・protected・public のものを表示する(既定)」と書いていて、2か所が食い違っています。実測は後者のとおりで、修飾子を付けていないメソッドも表示され、出なかったのは private だけでした。javap -v は、-c を付けなくても命令列まで表示しました
- ・JDK 25 のツールリファレンスのこの4つのページには、名前の由来を述べた文はありません。jar のページに、構文が tar コマンドに似ているとあるだけです
- ・Node との対応は位置のたとえです。jar と zip の道具の違いは、jar がマニフェストを自動で入れる点です。npm pack と jar の対応は、このコースでは確かめていません
- ・下のコードは、javac・jar・javap をコマンドとして起動せず、Java のプログラムの中から呼びます。この3つの中身は、JDK に入っている Java の部品です(JDK 22 と 25 で確認。30個すべてがそうだとは確かめていません)
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Java
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗