Tomcat Web アプリケーションの保護

tomcat は WAR を自己完結型の Tomcat ベースに変換します。パッケージャーに組み込まれた Tomcat コンポーネントを使い、ローカルにインストールされている Tomcat には一切触れません。

1. GUI での操作

  1. アプリケーションの種類のページで Tomcat WAR を選びます。

    Tomcat WAR を選ぶ

  2. 入力 WAR、同梱する Java バージョン、ターゲットプラットフォームを選び、シンプルモードか詳細設定モードかを選びます。

    入力、Java バージョン、ターゲットプラットフォーム、モードを選ぶ

  3. 詳細設定モードでは、Tomcat 9 か 10.1 を選ぶか自動検出のままにし、必要に応じてコンテキストパス、JVM スタートアップオプション、除外ルールを設定します。シンプルモードでは互換性スキャンの結果から Tomcat のバージョンが決まります。各オプションの意味は Protector4J 詳細設定モードを参照してください。

    Tomcat のバージョン、コンテキストパス、除外ルールを設定する

  4. 出力ディレクトリを選び、サマリーを確認して保護を実行をクリックします。

    出力ディレクトリを選んで保護を実行する

2. CLI の例

コンテキストパスを指定する場合:

p4j tomcat app.war dist --context /app

互換性スキャンと、推奨設定の自動適用:

p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app

この 2 つのオプションは同時に使えません。違いは次のとおりです。

オプション動作使いどころ
--compat-scan入力 WAR をスキャンし、リスクと設定の推奨を表示して終了します。エンコードは行わず dist も生成しないため、出力ディレクトリは不要です。初めて保護するとき、Tomcat 関連の依存関係を更新したあと、保護範囲や JSP の設定を変えたあと、互換性の問題を調べるときに、まずレポートを確認します。
--compat-applyスキャン後に保守的な推奨設定を取り込み、そのままエンコードして出力します。そのため出力ディレクトリが必要です。スキャン結果を確認して推奨設定を受け入れたあと、パッケージングを仕上げるときに使います。ルールが検証済みの繰り返しビルドや CI にも適します。

tomcat では、--compat-apply はスキャン結果にもとづいて除外ルールを追加し、Tomcat のバージョン、スキャナ ZIP オーバーレイ、アーカイブサフィックスを調整できます。この 3 つについては、コマンドラインで明示した値が優先されます。推奨される除外は、既定で明示した --exclude にマージされます。自動追加を望まない場合は --no-compat-excludes も一緒に指定してください。スキャナは静的なヒューリスティック解析のみを行うため、ソース修正が必要な問題は --compat-apply では解決されず、パッケージング後もターゲットプラットフォームでの回帰テストが必要です。

その他の CLI コマンド、全オプション、環境変数、自動化の例は CLI リファレンスを参照してください。

--tomcat-version の既定値は auto です。明示する場合は 9 または 10.1 を指定します。

p4j tomcat app.war dist --context /app --tomcat-version 10.1

3. 出力の構成

dist/
├── bin/
│   ├── catalina.sh
│   ├── startup.sh
│   ├── shutdown.sh
│   └── *.bat
├── conf/p4jx/
│   ├── contexts.list
│   ├── protected-classes.list
│   └── allowed-prefixes.list
├── protected/
│   └── app.p4jx
├── lib/
│   ├── p4jx-tomcat-runtime.jar
│   └── tomcat-runtime-deps.jar
├── vlxjre/
├── run.sh
└── run.bat

既定では物理的な WAR は生成されません。web.xml、静的リソース、保護していないクラス、メタデータスタブ、保護された実装はすべて protected/<context>.p4jx に入り、P4JX の WebResourceSet 経由で Tomcat に提供されます。

4. 起動と停止

フォアグラウンドで実行する場合:

./run.sh

Tomcat 流にバックグラウンドで起動・停止する場合:

./bin/startup.sh
./bin/shutdown.sh

Windows では対応する .bat を使います。ログは出力ディレクトリ内の logs/ に書き込まれます。

Windows 向けにパッケージングする場合は、組み込み Tomcat をフォアグラウンドで起動するネイティブランチャーも生成できます。詳細は Windows EXE ランチャーの生成を参照してください。

JVM スタートアップオプション

パッケージング時に、GUI の JVM スタートアップオプションで 1 行に 1 つ入力するか、コマンドラインで指定します。

p4j tomcat app.war dist \
  --context /app \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

配備済みパッケージで変更する場合:

  • macOS と Linux:bin/catalina.sh を編集し、run_java() 内の JVM_OPTS=(...) の後に JVM_OPTS+=("-Xms1g" "-Xmx2g") を追加します。フォアグラウンド実行にも、startup.sh によるバックグラウンド実行にも適用されます。
  • Windows のフォアグラウンド:bin\catalina.bat を編集し、既存の set "JVM_OPTS=..." の後に set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" を追加します。
  • Windows のバックグラウンド:bin\startup.batcatalina.bat を呼び出す前に set "APP_JAVA_OPTS=-Xms1g -Xmx2g" を追加します。フォアグラウンドとバックグラウンドの両方をまとめて恒久的に設定したい場合は、GUI か CLI でパッケージを作り直すほうが簡単です。

コマンドの前に APP_JAVA_OPTS を設定すれば、その 1 回だけ適用することもできます。CMD、PowerShell、スクリプトの詳しい例は JVM スタートアップオプションを参照してください。

5. Tomcat バージョンの選び方

WAR で使われている API 名前空間Tomcat必要な Java
javax.servlet.*Tomcat 9Java 8、11、17、21、25
jakarta.servlet.*Tomcat 10.1Java 11、17、21、25

自動検出では、まずアプリケーションのクラスと配備記述子から API の名前空間を判別し、JAR のファイル名は補助的な根拠としてのみ扱います。javaxjakarta の両方が使われている場合、ツールは推測を行いません。

6. JSP

WAR に JSP が含まれている場合、既定ではエンコード時にサーブレットクラスと URL マッピングへ事前コンパイルされます。実行時に JSP をコンパイルすると Tomcat の作業ディレクトリから新しいクラスを定義することになり、保護されたランタイムが許可するクラス定義の境界を越えてしまうためです。

明示的に制御することもできます。

--precompile-jsp
--no-precompile-jsp

本番環境では既定の事前コンパイルを維持してください。無効にすると、JSP を使うアプリケーションでページが表示されなくなることがあります。

7. 保護範囲と除外ルール

既定では WEB-INF/classes 配下のアプリケーションクラスを保護し、WEB-INF/lib は対象外です。Web に面したクラスは除外できます。

p4j tomcat app.war dist \
  --context /app \
  --exclude 'com.example.web.**,com.example.dto.**'

サーブレット、フィルター、リスナーをまず除外し、さらに DTO、設定クラス、エンティティ、JNI ブリッジクラス、コンテナーが拡張する必要のあるクラスも除外してください。互換性スキャンが保守的な推奨を示します。

8. 同じ Tomcat パッケージにアプリケーションを追加する

p4j tomcat second.war dist \
  --append-app \
  --context /second

制約:

  • コンテキストパスが既存のアプリケーションと重複してはいけません。
  • 既存のアプリケーションと新しいアプリケーションで、Tomcat のメジャーバージョン、Java バージョン、ターゲットプラットフォームが一致している必要があります。
  • --append-app を指定しない場合、ツールは既存の Tomcat パッケージへの書き込みを拒否します。
  • GUI では既存の Tomcat フォルダーにアプリケーションを追加にチェックを入れ、既存のディレクトリを選びます。

9. Java 8 での注意

Java 8 のターゲットでは ZIP オーバーレイが自動的に有効になり、Tomcat の WebResourceSet が保護済みアーカイブを開けるようになります。