← Spring コース
5. JAR・WAR・マニフェスト・実行可能 JAR
(Java Archive、拡張子 )は、 や設定ファイルを1つにまとめた zip 形式のファイルです。ライブラリを配る単位であり、アプリを配る単位でもあります。Node で近いのは、を1つにまとめたファイルです。ただし npm は node_modules に展開してから使いますが、JAR は展開せず、 がそのまま中を読みます。入っているのもコンパイル済みの .class です。
JAR の中の がで、ここに があれば で起動できます。(Web ARchive)は Web アプリを などのサーバに渡す形で、 に .class と を入れます。 は、依存の JAR も入れて java -jar だけで動く JAR で、 が作ります。
拡張子では、ライブラリの JAR とアプリの JAR を区別できません。 コマンドで作った JAR には、依存ライブラリも依存の一覧も入りません。package.json に依存を書く npm パッケージとは違います。実行可能 JAR は fat JAR や uber JAR と呼ばれることもあります。 は複数の WAR などをまとめる形で、名前だけ触れます。WAR や EAR に当たるものは Node にありません。
点線の付いた語はタップすると説明が出ます。用語集を開く →
.class と設定ファイルコンパイルの結果
zip 形式で1つにまとめる
JARMETA-INF/MANIFEST.MF(マニフェスト)と、パッケージ名どおりのフォルダに入った .class
java -cp か java -jar自分の .class と依存の JAR を、決まったフォルダに詰める
WARWEB-INF/classes に自分の .class、WEB-INF/lib に依存の JAR
Tomcat などのサーバに置く実行可能 JARBOOT-INF/classes に自分の .class、BOOT-INF/lib に依存の JAR
java -jar- ・JAR は Java Archive の略です(JDK 25 の jarsigner という道具の説明の表記)。JAR の仕様自体には展開形が無く、Jakarta EE の仕様は Jakarta Archive (JAR) と書いています。JAR の仕様(JDK 25)は、JAR を、任意で META-INF フォルダを持つ zip ファイルだと説明しています。META-INF は JAR の中の説明用のフォルダの名前で、マニフェストは JAR の説明書きに当たるファイルです
- ・WEB-INF は WAR の中の決まったフォルダ名で、ここに置いたものがサーバに読まれます。ブラウザから WEB-INF の中を直接取りに行くと 404 が返ります。WAR は Web ARchive(Servlet の仕様の表記)、EAR は Enterprise ARchive(Jakarta EE の仕様の表記)の略です
- ・Tomcat は HTTP を受け付けるサーバで、それ自体が Java のプログラムです。Servlet は、そのサーバから呼ばれるクラスの決まりです。どちらも後のレッスンで扱います
- ・BOOT-INF は Spring Boot が決めたフォルダ名です。Spring Boot 4.1.1 の最小の Web アプリでは、BOOT-INF/lib に依存の JAR が 34 本入っていました
- ・Spring Boot のリファレンスは、実行可能 JAR が uber jars や fat jars と呼ばれることがある、と書いています。ただし同じリファレンスは、全部の JAR の .class を1つに混ぜた JAR(shaded jar)のことも uber jar と呼び、JAR の中に JAR をそのまま入れる Spring Boot の作り方と区別しています。Spring Boot そのものは後のレッスンで扱います
- ・Spring Boot は、java -jar でも Tomcat に置いても動く WAR も作れます。WAR は必ずサーバに置くもの、とは言い切れません
- ・Maven というビルドツール(後のレッスンで扱います)で作った JAR には、pom.xml という定義ファイルの写しが入っていることがあります。
- ・npm パッケージとの対応は役割のたとえです。下のコードは、JAR を1つメモリ上に作り、普通の zip として読み直します
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Java
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗