Spring Bootアプリケーションの保護

Spring Bootアプリケーションを保護するためのspringbootで、BOOT-INF/classesBOOT-INF/lib、Spring Boot Loader、およびフレームワークスキャンを処理できます。

1. GUI操作

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

    Spring Bootを選択する

  2. 保護したいSpring Bootアプリケーション、同梱されているJavaバージョン、およびターゲットプラットフォームを選択し、シンプルモードまたはアドバンスドモードを選びます。

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

  3. アドバンスドモードを使用する場合は、出力レイアウト、保護対象の依存JAR、JavaFX、JVMパラメータ、除外規則を必要に応じて選択します。シンプルモードでは、互換性スキャンに基づいて自動的にレイアウトや除外項目が提案されます。各オプションの詳細はProtector4Jの高度なモード設定を参照してください。

    Spring Bootの高度なパラメータを設定する

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

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

2. CLIの例

最小コマンド:

p4j springboot app.jar dist

デフォルトではp4jx-fatレイアウトが使用されます。別のレイアウトを明示的に選択するには:

p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate

選択的な保護:

p4j springboot app.jar dist \
  --protect 'com.example.service.impl.**' \
  --exclude 'com.example.dto.**,com.example.config.**'

3. 出力構造とレイアウトの設定

p4jx-fat:デフォルトで、1つの保護されたアプリケーションをアーカイブ化

dist/
├── app.p4jx              # jarサフィックスを使用する場合はapp.jarとなる
├── vlxjre/
├── run.sh
├── run.command
└── run.bat

特徴:

  • 1つのP4JXアプリケーションをアーカイブ化した形で提供される
  • 物理ファイルはデフォルトでZIP形式にはなりません;
  • Spring Bootのリソース、ネストされた依存関係、およびメタデータは仮想JARビューを通じて提供されます;
  • 保護範囲が最も広く、サードパーティ製のclasspathスキャナーの依存関係がないアプリケーションに適しています。

fat:Spring Boot互換の構成

dist/
├── app.jar
├── app.p4jx              # jarのサフィックスの場合はapp-protected.jarとなります
├── vlxjre/
└── run.*

特徴:

  • app.jarは、標準的なBOOT-INFの物理的構造を維持します;
  • 保護されるクラスの実際の実装は、隣接するP4JXアーカイブ内にあります;
  • ClassGraphやReflectionsなど、物理的なSpring Boot JAR構造をスキャンする必要があるアプリケーションに適しています。
  • 2つのファイルは結合関係にあるため、一緒に更新し、提供する必要があります。

separate:分離型の互換性レイアウト

dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*

特徴:

  • Spring Boot Loader、公開クラス、依存関係が分離されています。
  • 平準化されたlib/*のクラスパスが必要な古い統合環境に適しています。
  • 保護されたクラスは、生成されたスターターによって事前にロードされます。
  • 新しいプロジェクトでは、優先的にp4jx-fat、またはスキャナーが推奨するfatを使用します。

レイアウトの選び方

使用シナリオ推奨されるレイアウト
通常のSpring Bootサービスp4jx-fat
アプリケーションが実際にClassGraphやReflectionsといったスキャナを呼び出す場合fat
フラットな外部依存ディレクトリを使用する必要がある場合、または依存ファイルを別途暗号化する必要がある場合separate
不明まず--compat-scanを実行する

ZIP overlayはZIPの中央ディレクトリを直接読み取るためのツールに過ぎず、ClassLoader/classpathスキャナーが必要とする実際のSpring Boot構造の代わりにはなりません。

4. 起動

./run.sh --spring.profiles.active=prod

Windows:

run.bat --spring.profiles.active=prod

出力ディレクトリ内のvlxjreの代わりにシステムのJREを使用してはいけません。

Windowsターゲットをパッケージ化する際には、ネイティブな起動プログラムも追加で生成でき、3つのレイアウトすべてに対応し、起動スクリプトと共存します。詳細はWindows EXE起動ツールの生成を参照してください。

JVM起動パラメータ

パッケージ化時には、GUI上のJVM startup options(1行に1つ)またはCLIを使用してJVMパラメータを固定できます。

p4j springboot app.jar dist \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

デプロイ時に一時的に追加:

APP_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" ./run.sh

また、現在のデプロイスクリプトを直接修正することも可能です:

  • macOS/Linux:run.shで既に生成されたJVM_OPTS=(...)/JVM_OPTS+=(...)の後に、JVM_OPTS+=("-Xms1g" "-Xmx2g")を追加してください。
  • Windows:run.batで既に生成されたset "JVM_OPTS=..."の後に、set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"を追加してください。

Spring BootやJavaFXによって自動的に生成された--add-opensやmodule pathなどの内部パラメータは削除しないでください。再パッケージングすると手動で行った変更が上書きされてしまいます。詳細はJVM起動パラメータの設定をご覧ください。

5. 保護範囲

デフォルトではBOOT-INF/classes内のアプリケーションクラスが「保護」されます。以下のSpring対応クラスは通常のクラスとして残すことを推奨します:

  • @Controller@RestController@ControllerAdvice
  • @Configuration、自動設定クラス、AOT/CGLIBによる拡張クラス;
  • Jackson DTO、JPA Entity、record、および検証モデル;
  • アプリケーションのエントリポイントや、フレームワークによって直接作成/プロキシ処理されるクラス;
  • 実行時のバイトコード強化が必要なクラスです。

保護サービスの実装で、公開されたファサードやインターフェースを通じてアクセスします。ルールでは、正確なクラス名、pkg.*、およびpkg.**をサポートしています。

6. 保護に必要なJARファイル

--protect-libにより、一致するBOOT-INF/libの依存関係を保護でき、3つのレイアウトすべてでサポートされています。

p4j springboot app.jar dist \
  --protect-lib 'company-core-*.jar,pricing-*.jar'

自社のクローズドソースの依存関係のみを保護します。“より多くのものを保護する”のために、Spring、Tomcat、ログ、データベースドライバなどのサードパーティフレームワークのパッケージを暗号化してはいけません。

7. 互換性スキャン

p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply

これら2つのオプションは同時に使用できず、その違いは以下の通りです。

オプション動作使用時期
--compat-scan入力されたJARのみをスキャンし、リスクや設定上の推奨事項を出力した後に終了する。エンコードやdistの生成は行わないため、出力ディレクトリは不要である。アプリケーションを初めて保護したり、Spring Bootやその他の依存関係をアップグレードしたり、保護範囲やレイアウトを変更したり、互換性の問題を調査する際に、まずこのツールを使ってレポートを確認する。
--compat-applyスキャン後に自動的に保守的な推奨事項を統合し、その後エンコードを続けて出力を生成するため、必ず出力ディレクトリを指定する必要がある。スキャン結果を確認し、自動的に提案された事項を受け入れた場合に、このツールを使ってパッケージングを完了する。また、ルールが既に検証済みの繰り返しビルドやCIプロセスにも使用できる。

springbootおよび--compat-applyでは、スキャン結果に基づいてレイアウトを選択したり、除外するクラスを追加したり、ZIP overlay、JavaFX、アーカイブのサフィックスなどのオプションを調整したりできる。除外クラス以外のこれらのオプションについては、コマンドラインで明示的に指定された値が優先される。推奨される除外クラスは、デフォルトで明示的に指定された--excludeと統合される。自動的に除外クラスを追加したくない場合は、--no-compat-excludesも同時に指定できる。スキャナーは静的なヒューリスティック分析のみを行うため、コードを修正が必要な問題は--compat-applyによって自動的には修正されず、生成後も対象プラットフォームでのリグレッションテストが必要である。

その他のCLIコマンド、すべてのオプション、環境変数、自動化の例については、CLIパラメータの参考情報を参照してください。