JavaでWebアプリケーションを開発していると、必ず出会うのが「WARファイル」です。
「sample.warって何?」
「どうやって開くの?」
「どこにデプロイすればいいの?」
このような疑問を持つ方は多いでしょう。
この記事では、Javaの世界で重要な役割を果たす WARファイル(ワーファイル) について、初心者の方にも分かりやすく解説していきます。
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
このコマンドを実行すると:
- プロジェクトをクリーン
- コンパイル
- 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 コマンドを使う(手動)
ビルドツールを使わない場合、手動で作成できます。
手順:
- ディレクトリ構造を作る
mkdir -p myapp/WEB-INF/classes
mkdir -p myapp/WEB-INF/lib
- ファイルを配置
- HTMLやJSPをルートに
- コンパイルしたクラスファイルをclasses/に
- ライブラリをlib/に
- WARファイルを作成
cd myapp
jar -cvf ../myapp.war *
オプションの意味:
-c
:新しいアーカイブを作成-v
:詳細な出力(verbose)-f
:ファイル名を指定
方法4:IDE を使う
Eclipse の場合:
- プロジェクトを右クリック
- Export → WAR file を選択
- 保存先を指定してFinish
IntelliJ IDEA の場合:
- Build → Build Artifacts を選択
- WARファイルが生成される
WARファイルのデプロイ方法
作成したWARファイルをサーバーに配置する方法です。
Apache Tomcat へのデプロイ
Tomcat(トムキャット)は、最も人気のあるJavaサーブレットコンテナです。
方法1:webappsディレクトリに配置(ホットデプロイ)
- WARファイルをコピー
cp myapp.war /path/to/tomcat/webapps/
- 自動的に展開される
- Tomcatが自動的にWARファイルを検出
- 展開して起動
- アクセス
- ブラウザで
http://localhost:8080/myapp/
にアクセス
方法2:Manager アプリケーションを使う
- ブラウザで
http://localhost:8080/manager/html
を開く - ユーザー名とパスワードを入力
- 「Deploy」セクションでWARファイルを選択
- 「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:管理コンソールを使う
- ブラウザで
http://localhost:9990
を開く - Deployments → Add を選択
- WARファイルをアップロード
GlassFish へのデプロイ
GlassFish(グラスフィッシュ)は、Oracle(旧Sun)が開発したアプリケーションサーバーです。
asadminコマンドを使う:
asadmin deploy myapp.war
管理コンソールを使う:
- ブラウザで
http://localhost:4848
を開く - Applications → Deploy を選択
- 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:
- WARファイルをダブルクリック
- アーカイブの内容が表示される
Eclipse:
- プロジェクトエクスプローラーでWARファイルを右クリック
- 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/に含まれていません。
解決方法:
- 依存関係を確認
Mavenの場合、pom.xml
を確認:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
- スコープを確認
provided
:サーバーが提供(WARに含めない)compile
またはruntime
:WARに含める
問題3:404 Not Found エラー
原因:
- URLマッピングが間違っている
- ファイルが正しい場所にない
解決方法:
- web.xmlのマッピングを確認
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- アクセス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ファイルが残っている
原因:
以前のバージョンが完全に削除されていません。
解決方法:
- アプリケーションを停止
# Tomcatの場合
/path/to/tomcat/bin/shutdown.sh
- 古いファイルを削除
rm -rf /path/to/tomcat/webapps/myapp
rm /path/to/tomcat/webapps/myapp.war
rm -rf /path/to/tomcat/work/Catalina/localhost/myapp
- 新しいWARファイルを配置
cp myapp.war /path/to/tomcat/webapps/
- サーバーを起動
/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アプリケーションの開発・デプロイに自信を持って取り組んでくださいね!
コメント