はじめに
Java を学び始めると、package 宣言や pom.xml、ビルドして出てくる .jar / .war といった用語に出会います。最初はどれが何のためのものか分かりにくいと思います。
この記事では、package・pom.xml・jar・war の4つについて、それぞれの役割と用途を整理します。ビルドツールは Maven を前提とします。
まず全体像
ざっくり言うと、それぞれの立ち位置は以下のようになります。
| 用語 | 種類 | 役割 |
|---|---|---|
package |
ソースコード上の仕組み | クラスを名前空間で分類・整理する |
pom.xml |
設定ファイル | プロジェクトの構成やライブラリ、ビルド方法を定義する |
.jar |
成果物(ファイル) | 配布・実行できる形にまとめたもの(主にライブラリやアプリ) |
.war |
成果物(ファイル) | Web アプリをサーバーにデプロイする形にまとめたもの |
package はコードの書き方の話、pom.xml はビルドの設定の話、.jar / .war はビルドした結果できあがるファイルの話、という違いがあります。
package:クラスを整理する仕組み
package は、クラスをグループ分けして整理するための仕組みです。フォルダで書類を分類するイメージに近いと思います。
package com.example.app;
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
package com.example.app; と書くと、この Main クラスは com.example.app というパッケージに属することになります。同じ名前のクラスでもパッケージが違えば別物として扱えるので、名前の衝突を防げます。
パッケージ名はソースコードのディレクトリ構成とも対応します。上の例なら src/main/java/com/example/app/Main.java という場所に置きます。
パッケージ名は、自分が持っているドメインを逆順にした形(例:com.example)にする慣習があります。世界中で名前が重複しないようにするための工夫です。
pom.xml:プロジェクトの設計図
pom.xml は Maven というビルドツールが使う設定ファイルです。POM は「Project Object Model」の略で、プロジェクトに関する情報をまとめて書きます。
主に次のようなことを書きます。
- プロジェクトの名前やバージョン
- 使用するライブラリ(依存関係)
- 成果物の種類(jar にするか war にするか)
- ビルドの設定
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<!-- プロジェクトを識別する情報 -->
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<!-- 成果物の種類(jar / war など) -->
<packaging>jar</packaging>
<!-- 使用するライブラリ -->
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
</dependencies>
</project>
特に便利なのが <dependencies> です。ここに使いたいライブラリを書いておくと、Maven が自動でダウンロードしてプロジェクトに組み込んでくれます。ライブラリの jar ファイルを手動で探してきて配置する、といった手間がなくなります。
<packaging> の値を jar にするか war にするかで、ビルド時にできあがる成果物の種類が変わります。
jar:実行・配布のためにまとめたファイル
.jar は「Java ARchive」の略で、コンパイル済みのクラスファイル(.class)や設定ファイルなどを1つにまとめた成果物です。中身は ZIP 形式の圧縮ファイルになっています。
jar には主に2つの使われ方があります。
| 使われ方 | 説明 |
|---|---|
| ライブラリとして | 他のプロジェクトから部品として読み込んで使う |
| 実行可能ファイルとして |
java -jar コマンドで直接アプリを起動する |
実行可能な jar は、次のように動かせます。
java -jar my-app.jar
クラスファイルが何十個もあると配布や実行が大変ですが、jar に固めておけばファイル1つで扱えます。pom.xml の <packaging> を jar にした場合、mvn package を実行すると jar が作られます。
mvn package
war:Web アプリをサーバーに置くためのファイル
.war は「Web Application ARchive」の略で、Web アプリケーションを1つにまとめた成果物です。jar と同じく ZIP 形式ですが、Web アプリ向けに決まった構成を持っている点が違います。
war には、クラスファイルに加えて HTML や CSS、JSP、web.xml などの Web アプリに必要なファイルが含まれます。
war は単体では動かず、Apache Tomcat のような サーブレットコンテナ(Web サーバー) に配置(デプロイ)して動かします。
pom.xml の <packaging> を war にすると war が作られます。
<packaging>war</packaging>
最近の Spring Boot などでは、Tomcat を内蔵した実行可能 jar として作り、java -jar で直接起動するスタイルも増えています。そのため「Web アプリ=必ず war」というわけではありません。従来型のサーバーにデプロイする場合に war を使う、と考えるとよいと思います。
jar と war の違いの整理
混同しやすい jar と war を並べて整理します。
| 観点 | jar | war |
|---|---|---|
| 正式名称 | Java ARchive | Web Application ARchive |
| 主な用途 | ライブラリ、または単体実行アプリ | Web アプリ |
| 動かし方 |
java -jar で実行、または部品として読み込む |
サーブレットコンテナにデプロイ |
| 含まれるもの | クラスファイル、設定ファイル | クラスファイル+HTML/CSS/JSP など Web 用ファイル |
まとめ
この記事では package・pom.xml・jar・war の役割を整理しました。
-
packageはクラスを名前空間で整理する仕組み、ソースコードの書き方の話 -
pom.xmlは Maven の設定ファイル、依存ライブラリや成果物の種類を定義する設計図 -
.jarはクラスなどをまとめた成果物、ライブラリや実行可能アプリとして使う -
.warは Web アプリをまとめた成果物、サーブレットコンテナにデプロイして動かす