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

tomcat:WARファイルを自己包含型のTomcatベースに変換します。実行時にはエンコーダに内蔵されたTomcatコンポーネントが使用され、ユーザーのマシンにインストールされているTomcatは読み込まれません。

1. GUIによる操作

  1. アプリケーションタイプのページでTomcat WARを選択します。

    Tomcat WARを選択します

  2. 入力するWARファイル、同梱されているJavaバージョン、およびターゲットプラットフォームを選択し、シンプルモードまたはアドバンスドモードを選びます。

    入力方法、Javaのバージョン、ターゲットプラットフォーム、およびモードを選択します

  3. アドバンスドモードを使用する場合は、Tomcat 9/10.1を選択するか自動検出のままにし、必要に応じてContext Path、JVMパラメータ、除外規則を設定します。シンプルモードでは互換性スキャンによって適切なTomcatバージョンが提案されます。各オプションの詳細はProtector4Jの高度なモード設定を参照してください。

    Tomcatのバージョン、Context Path、および除外規則を設定する

  4. 出力ディレクトリを選択し、パラメータの要約を確認した後、Run protectionをクリックします。

    出力先ディレクトリを選択し、『保護』を実行します

2. CLIの例

指定されたContext Path:

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 overlay、アーカイブのサフィックスなどのオプションを調整したりできます。後者の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/に記録されます。

JVM起動パラメータ

パッケージ作成時はGUIのJVM startup optionsにて1行に1つのパラメータを入力するか、CLIを使用できます。

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を設定することができます。完全なCMD、PowerShell、およびスクリプトの例はJVM起動パラメータの設定をご覧ください。

5. Tomcatのバージョン選択

WAR API 名前空間TomcatJavaの要件
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が含まれている場合、デフォルトでエンコーディング段階で自動的にservletクラスおよび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.**'

特にservlet/filter/listener、DTO、設定ファイル、エンティティ、JNIブリッジクラス、およびコンテナによる拡張が必要なクラスは除外すべきです。互換性スキャンにより、慎重な推奨事項が示されます。

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

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

制約事項:

  • context pathは、既存のアプリケーションと重複してはなりません;
  • 新旧のアプリケーションは、同じTomcatのメジャーバージョン、Javaのバージョン、およびターゲットプラットフォームを使用しなければなりません;
  • --append-appが指定されていない場合、ツールは既存のTomcatパッケージへの書き込みを拒否します。
  • GUIで“Append application to an existing Tomcat folder”をチェックし、直接既存のディレクトリを選択します。

9. Java 8に関する注意事項

Java 8のターゲットではZIP overlayが自動的に有効になり、Tomcat WebResourceSetによって保護されたアーカイブを開くことができます。