JavaFX アプリケーションの保護

通常の Java アプリケーションでも Spring Boot のデスクトップアプリケーションでも JavaFX を有効にできます。P4JX のスリムなランタイムには既定で JavaFX が含まれていないため、明示的に有効にするか、互換性スキャンに任せて有効にする必要があります。

1. GUI での操作

  1. 通常の JavaFX アプリケーションは、アプリケーションの種類のページで Java アプリケーションを選びます。Spring コンテナーの上に構築した JavaFX デスクトップアプリケーションは Spring Boot を選びます。ライブラリ暗号化は保護済みアーカイブを生成するだけで、JavaFX アプリケーションのパッケージングの代わりにはなりません。

    Java アプリケーションまたは Spring Boot を選ぶ

  2. 入力 JAR、同梱する Java バージョン、ターゲットプラットフォームを選び、シンプルモードか詳細設定モードかを選びます。JavaFX のコンポーネントはターゲットの Java バージョンとプラットフォームごとに取得されるため、複数プラットフォームのタスクではそれぞれ独立した出力パッケージが生成されます。

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

  3. シンプルモードでは、互換性スキャンが javafx.* の参照や JavaFX の依存関係を見つけると、JavaFX を自動的に有効にし、その理由をスキャン結果に表示します。javafx.scene.web も見つかった場合は WebView も含まれます。スキャンは静的なヒューリスティック解析なので、出力ページに進んだあとも JavaFX のサマリーを確認してください。

  4. 詳細設定モードでは、JavaFX ランタイムタブで JavaFX をパッケージランタイムに含めるにチェックを入れ、WebView の方針を選びます。

    • 自動 (javafx.scene.web を検出):アプリケーションが javafx.scene.web を参照しているかどうかで決めます。
    • 含める:常に WebView (fx-webkit) を含めます。
    • 除外:WebView を含めません。

    通常の Java アプリケーションでのタブは次のとおりです。

    通常の Java アプリケーションの詳細オプションにある JavaFX ランタイムタブ

    Spring Boot のデスクトップアプリケーションでも同じ名前のタブを使います。

    Spring Boot の詳細オプションにある JavaFX ランタイムタブ

  5. 出力ディレクトリを選んだら、サマリーで JavaFX が同梱と表示され、WebView の状態が想定どおりであることを確認してから保護を実行をクリックします。生成後は、パッケージ内の起動スクリプトを使い、ターゲットプラットフォームごとにウィンドウ、FXML、CSS や画像リソース、WebView を確認してください。

WebView のコンポーネントはおよそ 40 MB あります。使わない場合は除外を選ぶとパッケージを小さくできます。詳細ページのその他の設定については Protector4J 詳細設定モードを参照してください。

2. CLI でコンポーネントを取得する

p4j javaapp fx-app.jar dist --javafx

Spring Boot と JavaFX を組み合わせる場合:

p4j springboot fx-boot.jar dist --javafx

WebView を強制的に含める、または除外する場合:

--javafx-webview
--no-javafx-webview

ツールは、ターゲットの JDK トレインとプラットフォームに応じて、現在のリージョンの公開ダウンロードサイトから対応するコンポーネントを取得します。JavaFX のダウンロードも VLX JRE のダウンロードも、クラウドストレージのキーをクライアントに渡す必要はありません。

3. オフラインでのコンポーネント指定

CLI ではローカルディレクトリを指定できます。

p4j javaapp fx-app.jar dist --javafx /opt/p4jx-fx

このディレクトリは次のいずれかの形式です。

  • fx-core.tar.gz と、任意で fx-webkit.tar.gz
  • lib/ をルートとして展開済みの JavaFX ファイルツリー

GUI にはローカルの JavaFX ディレクトリを選ぶ機能がないため、オフラインの場合は CLI を使ってください。

4. FXML

アプリケーションが FXMLLoader を使っている場合、互換性スキャンはスキャナ ZIP オーバーレイを有効にすることを推奨します。

p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner

FXML のリソース、コントローラーのシグネチャ、フレームワークのスキャンは、いずれもターゲットプラットフォームで実際にアプリケーションを起動して確認する必要があります。

5. Java 8 と Java 11 以降

  • Java 8 は jfxrt.jar と拡張ディレクトリのモデルを使うため、生成されるスクリプトに通常モジュールオプションは不要です。
  • Java 11 以降はモジュール化された JavaFX の JAR を使うため、生成されるスクリプトが専用のモジュールパスと --add-modules を設定します。

必ず生成された run.shrun.commandrun.bat から起動してください。vlxjre/lib 全体を自分でモジュールパスに指定しないでください。

6. 自動判定の仕組み

判定は、自分のコードにあるクラス参照と、依存 JAR のファイル名を見て行われます。すべてのサードパーティ依存のバイトコードまで深く調べることは意図的に避けています。そこまで調べると、任意で組み込めるだけの JavaFX 連携を実際に使っていると誤判定してしまうためです。

名前から判別できない依存関係に JavaFX が shade されている場合、自動判定では見落とすことがあります。その場合は --javafx を明示的に指定してください。

7. 推奨する保護範囲

  • JavaFX の Application サブクラス、FXML コントローラー、プロパティモデルを保護するかどうかは、ターゲットの Java バージョンでの実測結果にもとづいて判断してください。
  • JNI やネイティブコードから直接アクセスされるブリッジクラスは、保護しないままにします。
  • まずシンプルモードか --compat-scan を使い、そのうえでウィンドウの生成、FXML の読み込み、CSS や画像リソース、WebView、プラットフォームのネイティブライブラリについて回帰テストを行ってください。