WARファイルとは?JavaのWebアプリケーションパッケージを徹底解説

Java

JavaでWebアプリケーションを開発していると、必ず出会うのが「WARファイル」です。

「sample.warって何?」
「どうやって開くの?」
「どこにデプロイすればいいの?」

このような疑問を持つ方は多いでしょう。

この記事では、Javaの世界で重要な役割を果たす WARファイル(ワーファイル) について、初心者の方にも分かりやすく解説していきます。

スポンサーリンク
  1. WARファイル(War File)とは何か?
    1. 引っ越しの荷物に例えると分かりやすい
    2. なぜWARファイルが必要なのか
  2. WARファイルの構造:中身はどうなっている?
    1. 基本的なディレクトリ構造
    2. 各ディレクトリの役割
    3. web.xml の例
  3. WARファイルの作成方法
    1. 方法1:Maven を使う(最も一般的)
    2. 方法2:Gradle を使う
    3. 方法3:jar コマンドを使う(手動)
    4. 方法4:IDE を使う
  4. WARファイルのデプロイ方法
    1. Apache Tomcat へのデプロイ
    2. WildFly (JBoss) へのデプロイ
    3. GlassFish へのデプロイ
  5. WARファイルとJARファイルの違い
    1. JARファイル(Java Archive)
    2. WARファイル(Web Archive)
    3. EARファイル(Enterprise Archive)
  6. WARファイルの中身を確認する方法
    1. 方法1:zip として解凍する
    2. 方法2:jar コマンドを使う
    3. 方法3:IDE で開く
  7. WARファイルのトラブルシューティング
    1. 問題1:デプロイしても起動しない
    2. 問題2:ClassNotFoundException エラー
    3. 問題3:404 Not Found エラー
    4. 問題4:メモリ不足エラー
    5. 問題5:古いWARファイルが残っている
  8. WARファイルのベストプラクティス
    1. 1. バージョン番号を含める
    2. 2. 不要なファイルを含めない
    3. 3. ログレベルを適切に設定
    4. 4. セキュリティを考慮する
    5. 5. 依存関係を最小限にする
    6. 6. ドキュメントを用意する
  9. WARファイルと現代の開発:変化する役割
    1. Spring Boot との関係
    2. Docker コンテナとの関係
    3. マイクロサービスアーキテクチャ
  10. まとめ:WARファイルはJava Webアプリケーションの標準パッケージ

WARファイル(War File)とは何か?

WAR は「Web ARchive(ウェブ・アーカイブ)」の略で、JavaのWebアプリケーションをパッケージ化したファイル形式です。

一言で言うと、Webアプリケーションに必要なファイルを全部まとめて一つのファイルにしたものです。

引っ越しの荷物に例えると分かりやすい

引っ越しをする時、家具や服、食器などをバラバラに運ぶのは大変ですよね。

だから、ダンボール箱にまとめて詰めます。

WARファイルも同じです:

  • Javaのクラスファイル
  • HTML、CSS、JavaScriptファイル
  • 画像ファイル
  • 設定ファイル
  • ライブラリ(JARファイル)

これらすべてを一つのWARファイルにまとめています。

なぜWARファイルが必要なのか

理由1:配布が簡単

  • 数百個のファイルを一つずつコピーする必要がない
  • 一つのファイルを渡すだけで済む

理由2:デプロイが楽

  • サーバーに配置するのが簡単
  • 自動的に展開される

理由3:バージョン管理しやすい

  • 一つのファイルなので管理が楽
  • バックアップも簡単

理由4:標準化されている

  • Java EE(Jakarta EE)の標準規格
  • どのサーバーでも同じように動作

WARファイルの構造:中身はどうなっている?

WARファイルの中身を見てみましょう。

基本的なディレクトリ構造

WARファイルは、決められた構造を持っています。

myapp.war
├── index.html
├── login.jsp
├── css/
│   └── style.css
├── js/
│   └── app.js
├── images/
│   └── logo.png
├── WEB-INF/
│   ├── web.xml
│   ├── classes/
│   │   └── com/
│   │       └── example/
│   │           └── MyServlet.class
│   └── lib/
│       ├── mysql-connector.jar
│       └── commons-lang3.jar
└── META-INF/
    └── MANIFEST.MF

各ディレクトリの役割

ルートディレクトリ:

  • HTML、JSP、CSSなど、外部から直接アクセスできるファイル
  • ユーザーがブラウザで見るファイル

WEB-INF/ ディレクトリ:

  • 外部から直接アクセスできない保護された領域
  • 重要な設定やクラスファイルを格納

WEB-INF/classes/ ディレクトリ:

  • コンパイルされたJavaクラスファイル(.class)
  • パッケージ構造に従って配置される

WEB-INF/lib/ ディレクトリ:

  • アプリケーションが使用する外部ライブラリ(JARファイル)
  • データベース接続ライブラリなど

WEB-INF/web.xml ファイル:

  • デプロイメント記述子(Deployment Descriptor)
  • アプリケーションの設定情報
  • サーブレットのマッピング、初期パラメータなど

META-INF/ ディレクトリ:

  • マニフェストファイル
  • その他のメタ情報

web.xml の例

web.xmlは、Webアプリケーションの設定ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         version="4.0">

    <display-name>My Web Application</display-name>

    <!-- サーブレットの定義 -->
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.example.HelloServlet</servlet-class>
    </servlet>

    <!-- URLマッピング -->
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <!-- ウェルカムファイルの設定 -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

WARファイルの作成方法

実際にWARファイルを作る方法を見ていきましょう。

方法1:Maven を使う(最も一般的)

Maven(メイヴン)は、Javaプロジェクトのビルドツールです。

pom.xml の設定:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myapp</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>

    <build>
        <finalName>myapp</finalName>
    </build>
</project>

重要なのは <packaging>war</packaging> の部分です。

ビルドコマンド:

mvn clean package

このコマンドを実行すると:

  1. プロジェクトをクリーン
  2. コンパイル
  3. WARファイルを作成

完成したWARファイルは target/myapp.war に作成されます。

方法2:Gradle を使う

Gradle(グラドル)も人気のビルドツールです。

build.gradle の設定:

plugins {
    id 'war'
}

group = 'com.example'
version = '1.0.0'

war {
    archiveFileName = 'myapp.war'
}

dependencies {
    implementation 'javax.servlet:javax.servlet-api:4.0.1'
    // その他の依存関係
}

ビルドコマンド:

gradle war

完成したWARファイルは build/libs/myapp.war に作成されます。

方法3:jar コマンドを使う(手動)

ビルドツールを使わない場合、手動で作成できます。

手順:

  1. ディレクトリ構造を作る
mkdir -p myapp/WEB-INF/classes
mkdir -p myapp/WEB-INF/lib
  1. ファイルを配置
  • HTMLやJSPをルートに
  • コンパイルしたクラスファイルをclasses/に
  • ライブラリをlib/に
  1. WARファイルを作成
cd myapp
jar -cvf ../myapp.war *

オプションの意味:

  • -c:新しいアーカイブを作成
  • -v:詳細な出力(verbose)
  • -f:ファイル名を指定

方法4:IDE を使う

Eclipse の場合:

  1. プロジェクトを右クリック
  2. Export → WAR file を選択
  3. 保存先を指定してFinish

IntelliJ IDEA の場合:

  1. Build → Build Artifacts を選択
  2. WARファイルが生成される

WARファイルのデプロイ方法

作成したWARファイルをサーバーに配置する方法です。

Apache Tomcat へのデプロイ

Tomcat(トムキャット)は、最も人気のあるJavaサーブレットコンテナです。

方法1:webappsディレクトリに配置(ホットデプロイ)

  1. WARファイルをコピー
cp myapp.war /path/to/tomcat/webapps/
  1. 自動的に展開される
  • Tomcatが自動的にWARファイルを検出
  • 展開して起動
  1. アクセス
  • ブラウザで http://localhost:8080/myapp/ にアクセス

方法2:Manager アプリケーションを使う

  1. ブラウザで http://localhost:8080/manager/html を開く
  2. ユーザー名とパスワードを入力
  3. 「Deploy」セクションでWARファイルを選択
  4. 「Deploy」ボタンをクリック

方法3:コマンドラインからデプロイ

curl -u username:password \
     -T myapp.war \
     "http://localhost:8080/manager/text/deploy?path=/myapp&update=true"

WildFly (JBoss) へのデプロイ

WildFly(ワイルドフライ)は、Red Hatが開発するアプリケーションサーバーです。

方法1:deploymentsディレクトリに配置

cp myapp.war /path/to/wildfly/standalone/deployments/

方法2:管理コンソールを使う

  1. ブラウザで http://localhost:9990 を開く
  2. Deployments → Add を選択
  3. WARファイルをアップロード

GlassFish へのデプロイ

GlassFish(グラスフィッシュ)は、Oracle(旧Sun)が開発したアプリケーションサーバーです。

asadminコマンドを使う:

asadmin deploy myapp.war

管理コンソールを使う:

  1. ブラウザで http://localhost:4848 を開く
  2. Applications → Deploy を選択
  3. WARファイルを選択してデプロイ

WARファイルとJARファイルの違い

両方とも「.jar」コマンドで作れますが、用途が異なります。

JARファイル(Java Archive)

用途:

  • 通常のJavaアプリケーション
  • ライブラリのパッケージ化

実行方法:

java -jar myapp.jar

特徴:

  • main()メソッドを持つクラスが必要
  • スタンドアロンで動作
  • META-INF/MANIFEST.MF にMain-Classを指定

WARファイル(Web Archive)

用途:

  • Webアプリケーション専用
  • サーブレットコンテナで実行

実行方法:

  • サーバーにデプロイして実行
  • 単独では実行できない

特徴:

  • WEB-INF/ディレクトリが必須
  • web.xml で設定
  • HTTPリクエストで動作

EARファイル(Enterprise Archive)

WARやJARをさらにまとめたファイルです。

構造:

myapp.ear
├── myapp-web.war
├── myapp-ejb.jar
└── META-INF/
    └── application.xml

用途:

  • 大規模なエンタープライズアプリケーション
  • 複数のWARやJARを統合

WARファイルの中身を確認する方法

WARファイルの中を見たい時の方法です。

方法1:zip として解凍する

WARファイルは、実はZIP形式です。

Linuxの場合:

unzip myapp.war -d myapp-extracted

Windowsの場合:

  • ファイル名を myapp.zip に変更
  • 通常のZIPファイルとして解凍

macOSの場合:

unzip myapp.war

方法2:jar コマンドを使う

# 内容を一覧表示
jar -tf myapp.war

# 詳細情報付きで表示
jar -tvf myapp.war

# 展開
jar -xvf myapp.war

方法3:IDE で開く

IntelliJ IDEA:

  1. WARファイルをダブルクリック
  2. アーカイブの内容が表示される

Eclipse:

  1. プロジェクトエクスプローラーでWARファイルを右クリック
  2. Open With → Archive Explorer を選択

WARファイルのトラブルシューティング

よくある問題と解決方法です。

問題1:デプロイしても起動しない

原因:

  • web.xmlの記述ミス
  • 必要なライブラリが不足
  • Javaバージョンの不一致

解決方法:

ログを確認:

Tomcatの場合:

tail -f /path/to/tomcat/logs/catalina.out

WildFlyの場合:

tail -f /path/to/wildfly/standalone/log/server.log

web.xmlを検証:
XMLの構文エラーがないか確認します。

問題2:ClassNotFoundException エラー

原因:
必要なJARファイルがWEB-INF/lib/に含まれていません。

解決方法:

  1. 依存関係を確認

Mavenの場合、pom.xmlを確認:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
  1. スコープを確認
  • provided:サーバーが提供(WARに含めない)
  • compileまたはruntime:WARに含める

問題3:404 Not Found エラー

原因:

  • URLマッピングが間違っている
  • ファイルが正しい場所にない

解決方法:

  1. web.xmlのマッピングを確認
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
  1. アクセスURLを確認
  • コンテキストパス:/myapp
  • サーブレットパス:/hello
  • 完全なURL:http://localhost:8080/myapp/hello

問題4:メモリ不足エラー

原因:
アプリケーションがメモリを大量に消費しています。

解決方法:

Tomcatのメモリを増やす:

setenv.sh(Linuxの場合)を作成:

export CATALINA_OPTS="-Xms512m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"

オプションの意味:

  • -Xms:初期ヒープサイズ
  • -Xmx:最大ヒープサイズ
  • -XX:PermSize:初期Permサイズ(Java 7以前)
  • -XX:MaxPermSize:最大Permサイズ(Java 7以前)

問題5:古いWARファイルが残っている

原因:
以前のバージョンが完全に削除されていません。

解決方法:

  1. アプリケーションを停止
# Tomcatの場合
/path/to/tomcat/bin/shutdown.sh
  1. 古いファイルを削除
rm -rf /path/to/tomcat/webapps/myapp
rm /path/to/tomcat/webapps/myapp.war
rm -rf /path/to/tomcat/work/Catalina/localhost/myapp
  1. 新しいWARファイルを配置
cp myapp.war /path/to/tomcat/webapps/
  1. サーバーを起動
/path/to/tomcat/bin/startup.sh

WARファイルのベストプラクティス

効果的なWARファイルの作成と管理方法です。

1. バージョン番号を含める

ファイル名にバージョンを含めましょう。

良い例:

  • myapp-1.0.0.war
  • myapp-2.1.3.war

悪い例:

  • myapp.war(どのバージョンか分からない)

2. 不要なファイルを含めない

除外すべきもの:

  • ソースコード(.javaファイル)
  • テストコード
  • 開発用の設定ファイル
  • IDEの設定ファイル(.idea、.eclipseなど)

Mavenでの除外設定:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <packagingExcludes>
                    WEB-INF/lib/servlet-api*.jar,
                    WEB-INF/classes/test/**
                </packagingExcludes>
            </configuration>
        </plugin>
    </plugins>
</build>

3. ログレベルを適切に設定

開発環境:

  • DEBUG レベル
  • 詳細なログを出力

本番環境:

  • INFO または WARN レベル
  • 必要最小限のログ

4. セキュリティを考慮する

やるべきこと:

  • 機密情報をハードコードしない
  • 環境変数や外部設定ファイルを使用
  • WEB-INFディレクトリを活用(外部からアクセスできない)

やってはいけないこと:

  • パスワードをソースコードに書く
  • データベース接続情報を平文で保存

5. 依存関係を最小限にする

必要なライブラリだけを含める:

  • 使っていないライブラリは削除
  • サーバーが提供するライブラリはprovidedスコープに

6. ドキュメントを用意する

README.mdなどに記載すべき情報:

  • デプロイ方法
  • 必要な環境(Java バージョン、サーバーなど)
  • 設定方法
  • トラブルシューティング

WARファイルと現代の開発:変化する役割

近年、Webアプリケーションの開発手法が変化しています。

Spring Boot との関係

Spring Bootでは、WARファイルは必須ではありません。

実行可能JARファイル:

java -jar myapp.jar

Spring Bootは、組み込みTomcatを含むため、別途サーバーが不要です。

ただし、WARファイルも作成可能:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

pom.xmlで:

<packaging>war</packaging>

Docker コンテナとの関係

Dockerを使った配置:

FROM tomcat:9-jdk11
COPY target/myapp.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]

Dockerコンテナにサーバーごとパッケージ化するのが主流になっています。

マイクロサービスアーキテクチャ

大きなWARファイル一つではなく:

  • 小さなサービスに分割
  • それぞれを独立してデプロイ
  • コンテナで実行

という手法が増えています。

まとめ:WARファイルはJava Webアプリケーションの標準パッケージ

WARファイルは、JavaのWebアプリケーションを配布・デプロイするための標準的な形式です。

この記事のポイント:

  • WARは Web Archive の略
  • Webアプリケーションに必要なすべてのファイルをまとめたもの
  • WEB-INFディレクトリに重要なファイルを格納
  • web.xmlで設定を管理
  • MavenやGradleで簡単に作成できる
  • サーブレットコンテナ(Tomcat、WildFlyなど)にデプロイ

WARファイルの基本構造:

myapp.war
├── 公開ファイル(HTML、CSS、JSなど)
└── WEB-INF/
    ├── web.xml(設定ファイル)
    ├── classes/(Javaクラス)
    └── lib/(ライブラリ)

作成の基本手順:

# Mavenの場合
mvn clean package

# Gradleの場合
gradle war

デプロイの基本手順:

# Tomcatの場合
cp myapp.war /path/to/tomcat/webapps/

WARファイルは、Java EE(Jakarta EE)の標準規格として長年使われてきました。

最近はSpring BootやDockerなど新しい技術も登場していますが、WARファイルの知識は今でも重要です。

特に既存のシステムを保守する場合や、伝統的なアプリケーションサーバーを使う環境では、WARファイルの理解が欠かせません。

この記事で紹介した知識を基に、Java Webアプリケーションの開発・デプロイに自信を持って取り組んでくださいね!

コメント

タイトルとURLをコピーしました