通常の Java アプリケーションの保護

javaapp は、メインクラスを持つ通常の Java アプリケーションを扱います。保護済みアーカイブ、ターゲットプラットフォームごとの VLX JRE、起動スクリプトを生成します。

1. GUI での操作

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

    Java アプリケーションを選ぶ

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

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

  3. 詳細設定モードでは、必要に応じてメインクラスを入力し、JVM スタートアップオプション、JavaFX の設定、除外ルールを設定します。シンプルモードではこのページを省略します。各オプションの意味は Protector4J 詳細設定モードを参照してください。

    通常の Java アプリケーションの詳細オプションを設定する

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

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

2. CLI の例

マニフェストに正しい Main-Class がすでに宣言されている場合:

p4j javaapp app.jar dist

マニフェストに Main-Class がない場合や、別のクラスから起動したい場合は --main で指定します。

p4j javaapp app.jar dist --main com.example.Main

メインクラスと JVM オプションをまとめて指定する場合:

p4j javaapp app.jar dist \
  --main com.example.Main \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g

アプリケーションの一部だけを保護する場合:

p4j javaapp app.jar dist \
  --protect 'com.example.core.**' \
  --exclude 'com.example.core.dto.**'

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

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

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

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

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

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

3. 出力の構成

dist/
├── app.p4jx              # --archive-suffix jar を使うと app.jar
├── vlxjre/               # アーカイブとターゲットプラットフォームに対応するランタイム
├── lib/                  # マニフェストの Class-Path の依存関係 (任意)
├── run.sh
├── run.command
├── run.bat
└── README.md

クラス以外のリソースは、P4JX アーカイブの公開リソースビューに保存されます。保護対象クラスがスキャナに見せるのはメタデータスタブだけで、実際のメソッド本体は VLX ランタイムしか読み込めません。

4. 起動

./run.sh [アプリケーションの引数...]

Windows:

run.bat [アプリケーションの引数...]

出力ディレクトリの vlxjre をシステムの JRE で置き換えないでください。どうしても手動で起動する必要がある場合は、生成されたスクリプトを雛形として、クラスパス、VM オプション、JavaFX のモジュールオプションをそのまま引き継いでください。

Windows 向けにパッケージングする場合は、ダブルクリックで実行できるネイティブランチャーも生成できます。起動スクリプトと併存します。詳細は Windows EXE ランチャーの生成を参照してください。

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

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

--jvm-option -Xms512m --jvm-option -Xmx2g

配備済みのディレクトリで恒久的に変更する場合:

  • macOS と Linux:run.sh を編集し、APP_JAVA_OPTS の判定より前に JVM_OPTS+=("-Xms512m" "-Xmx2g") を追加します。run.command は同じ run.sh を呼び出します。
  • Windows:run.bat を編集し、APP_JAVA_OPTS の判定より前に set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" を追加します。

一時的なオプションは APP_JAVA_OPTS から注入できます。詳しい例と注意点は JVM スタートアップオプションを参照してください。手動で編集したスクリプトは、再パッケージング時に上書きされます。

5. 推奨する保護範囲

既定ではアプリケーション自身のクラスを保護します。本番プロジェクトでは、自社の業務パッケージを明示的に指定するほうが安全です。

--protect 'com.mycompany.product.**'

通常は除外すべきクラス:

  • Jackson が直接シリアライズ・デシリアライズする DTO やレコード
  • フィールドやメソッドに JNI からアクセスされるクラス
  • ORM、DI コンテナー、プロキシフレームワークが書き換える必要のあるクラス
  • サードパーティのライブラリとオープンソースのフレームワーク
  • カスタム ClassLoader がバイト配列から再定義する必要のあるクラス

6. .p4jx.jar のサフィックス

p4j javaapp app.jar dist --archive-suffix jar

このオプションはファイル名を変えるだけで、アーカイブの中身は P4JX のままです。サードパーティのコンポーネントが URL やファイル名に .jar をハードコードしている場合にのみ使ってください。アーカイブが通常の ZIP や JAR になるわけではありません。