Java EE(現Jakarta EE)ベースのWebアプリケーション開発において、「Dynamic Web Module」のバージョン指定は、ターゲットとするServletコンテナ(特にApache Tomcat)との互換性を確保する上で極めて重要です。バージョンの不整合は、デプロイメントエラーや実行時の予期せぬ挙動を引き起こす主要原因となります。
1. Dynamic Web ModuleとTomcatの対応関係
Dynamic Web Moduleのバージョンは、実装されているServlet APIの仕様バージョンに対応しています。下表に主要なバージョンと推奨されるTomcat環境を示します。
| Dynamic Web Module (Servlet Spec) | 対応する主なTomcatバージョン | 備考・特徴 |
|---|---|---|
| 2.4 | Tomcat 5.5 | J2EE 1.4準拠。古いレガシーシステムで頻出。 |
| 2.5 | Tomcat 6.0 | Java EE 5準拠。アノテーションサポートが本格化。 |
| 3.0 | Tomcat 7.0 | Java EE 6準拠。非同期Servlet、ファイルアップロード機能などが追加。 |
| 3.1 | Tomcat 8.0 / 8.5 | Java EE 7準拠。HTTP/2サポート準備など。重要:Tomcat 7では正式サポート外の場合あり。 |
| 4.0 | Tomcat 9.0 | Servlet 4.0準拠。HTTP/2プッシュなど。 |
注意点:
- Tomcat 8.0以降を使用する場合、Dynamic Web Moduleを3.1以上に設定することが推奨されます。3.0のままでも動作する場合がありますが、新機能の利用制限や警告が発生する可能性があります。
- 逆に、高バージョンのModule(例:3.1)を低バージョンのTomcat(例:7.0)で稼働させようとすると、`web.xml`のスキーマ検証エラーやクラスローディングの問題により起動失敗となることが多いです。
2. Eclipseでのバージョン変更手順
Eclipse IDEにおいて、既存プロジェクトのDynamic Web Moduleバージョンを変更する方法には2つのアプローチがあります。
方法A:GUI経由での直接変更
- プロジェクトを右クリックし、
Propertiesを選択します。 - 左メニューから
Project Facetsを開きます。 Dynamic Web Moduleチェックボックス内のドロップダウンリストから希望のバージョンを選択します。Apply and Closeをクリックします。
エラー発生時:「Cannot change version of project facet Dynamic Web Module to X.X」と表示される場合、内部依存関係の矛盾が生じているため、以下の方法Bで手動修正が必要です。
方法B:XML設定ファイルの手動編集
プロジェクトフォルダ内の隠しディレクトリ.settingsにある設定ファイルを直接編集します。
対象ファイル:
<ProjectRoot>/.settings/org.eclipse.wst.common.project.facet.core.xml
編集例:
例えば、Tomcat 8.0向けにServlet 3.1へ更新する場合、以下の行を修正します。
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<runtime name="Apache Tomcat v8.0"/>
<fixed facet="wst.jsdt.web"/>
<!-- jst.webのversion属性を目標のServlet仕様バージョンに変更 -->
<installed facet="jst.web" version="3.1"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
</faceted-project>
編集後、Eclipseでプロジェクトを右クリックしRefreshまたはCleanを実行して反映させます。
3. Mavenプロジェクトでの構成管理
Mavenを利用している場合、単にEclipseの設定を変えるだけでなく、ビルド定義とソースコード側の整合性を保つ必要があります。
ステップ1: web.xmlのヘッダー更新
src/main/webapp/WEB-INF/web.xmlのルート要素を、使用したいServlet仕様のXSDに合わせて更新します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- コンテンツ -->
</web-app>
ステップ2: pom.xmlでのコンパイラ設定
JavaバージョンとServlet APIの依存関係を正しく解決するため、maven-compiler-pluginを設定します。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
ステップ3: プロジェクトの再インポート
上記の変更を行った後、Eclipseでプロジェクトを右クリックし、Maven > Update Project... を選択して「Force Update of Snapshots/Releases」にチェックを入れて実行します。これにより、.settings内のFacet情報も自動的に正しい値に再生成されます。
4. 技術的な背景とベストプラクティス
Dynamic Web Moduleのバージョン上げは単なる数字の変更ではなく、以下のような技術的恩恵をもたらします。
- Servlet 3.0+: アノテーションによるServlet登録(
@WebServlet)、非同期処理、マルチパートフォームデータ解析の標準化。 - Servlet 3.1+: HTTP Upgradeプロトコル、NIOベースの入出力改善、より厳格なセキュリティ設定。
レガシーなJSPやServlet 2.4時代のコードを維持する必要がある場合を除き、可能な限り最新の安定版Servlet仕様(現在は4.0以上が主流)への移行を検討すべきです。ただし、移行前には必ずテスト環境で全機能を検証し、依存ライブラリとの競合がないことを確認してください。