0

.exe セットアップで展開するために、jpackage を使用して JavaFx (14) プロジェクトをパッケージ化しました。

プロジェクトの依存関係は次のとおりです。

  • Java 14.0.2
  • JavaFX 14.0.2.1
  • JRE 1.8.0_271 (削除)

そのため、複数のマシン (約 6 台) への展開中に、いくつかのマシンでは成功しましたが、他のマシンでは次のエラーが発生しました。

JVM can not launch

ただし、これらのマシンにはすべての依存関係が適切にインストールされており、環境変数も適切に定義されています。

誰かがそれについて私を助けることができます


いくつかの修正後 ( @Slawおよび@mipaによって言及され、新しいパッケージを生成してインストールしました。しかし、ソフトウェア (myApp.exe) を実行すると、このエラーが発生しました

Failed to lunch JVM

それについていくつかの調査の後、解決策は、C:\Program Files\ ソフトウェア フォルダーにある .jar ファイルを実行する Java コマンドを使用してバッチ ファイルを作成することでした。

cd "C:\Program Files\software\app"
java --module-path "C:\Program Files\Java\javafx-sdk-14.0.2.1\lib" --add-modules=ALL-MODULE-PATH --add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED -jar software.jar

私はそれを行い、ソフトウェアを非常にうまく実行しましたが、バッチファイルなしでソフトウェアを直接実行するための別の最適化ソリューションはありますか?

一部のコンピューターでは、バッチがソフトウェアを実行せず、同じエラーが返されました: Failed to lunch JVM

助けてください

4

1 に答える 1

0

アプリケーションを手動で起動する必要が--module-pathあり--add-modules、アプリケーションのパッケージ化中に JavaFX を含めることができなかった場合、または少なくとも JavaFX を正しく含めることができなかった場合。コードがモジュール化されていなくても、JavaFX はモジュール化されていることに注意してください。したがって、アプリケーションをパッケージ化するときは、jpackageJavaFX をモジュールとして扱うように指示する必要があります。

まず、JavaFX JMOD ファイルを取得する必要があります。少なくとも 2 つの方法のいずれかでそれらを取得できます。

  1. Gluon から JMOD ファイルをダウンロードします (JavaFX SDK をダウンロードしたのと同じ場所)。
  2. JavaFX を含む JDK をインストールして使用します (Zulu Community、BellSoft Liberica などから)。
    • このオプションを使用すると、最初から JavaFX SDK は必要ありません。

JMOD ファイルが必要なのは、ネイティブ コード (およびライセンスなどのその他のもの) を Java コードと共にパッケージ化するためです。これにより、ネイティブ コードをカスタム ランタイム イメージに適切に含めることができますjlink(舞台裏で によって使用されます)。jpackageまた、JavaFX (および JMOD ファイルの拡張) はプラットフォーム固有であることを忘れないでください。またjpackage、起動されたオペレーティング システム用のアプリケーションのみを作成できます。

JMOD ファイルを取得したら、アプリケーションをパッケージ化します。コードがモジュール式ではなく (-jar質問で使用)、コードを JAR ファイルにパッケージ化したとします。次のコマンドは、使用する必要がある最低限のものですjpackage

jpackage --type app-image --module-path <path-to-jmods> --add-modules <needed-modules> 
         --input <dir-containing-your-jar-file> --main-jar <your-jar-file>
         --main-class <your-main-class> --dest <your-output-location>

いくつかのメモ:

  • JavaFX を含む JDK をインストールして使用する場合は、必要ありません--module-path。少なくとも JavaFX ではありません。

  • アプリケーションに必要なモジュールがわかりません(--add-modulesオプション用)。あなたは使っていますが、私はあなたがすべてALL-MODULE-PATHを必要としているとは思えません。

  • 肯定的ではありませんがMain-Class、JAR ファイルのマニフェストに属性がある場合--main-classは必要ないと思います。

  • 本当に引数が必要な場合は--add-exports、次を使用できます。

    --java-options="--add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED"
    
  • --add-modulesコードをモジュール化すると、引数を取り除くこともできます。代わりに、モジュール (および JDK にないモジュール) を and に置き、、、およびをand--module-pathに置き換えます。--input--main-jar--main-class--module-path--module

    • この場合--input、もはや必要ではないようです。ただし、アプリケーションに必要な他のファイル (セキュリティ ポリシー ファイルなど) がある場合は、--input.

詳細については、JPackage ユーザー ガイドを参照してください。ガイドに記載されているアプリケーションをカスタマイズする方法は多数ありますが、この回答には記載されていません。

それでもすべてのコンピューターで「JVM の起動に失敗しました」エラーが解決しない場合は、さらにデバッグを行う必要があります。最初に必要なのは、問題の原因となっている実際のエラーを知ることです。これを行うには、少なくとも 2 つの方法が考えられます。

  1. アプリケーションにロギングを追加します。ファイルにログを記録します。
  2. jpackageアプリケーションをコンソール ベースにするように構成します。次に、コンソールからアプリケーションを起動して、出力を確認します。出力の表示に問題がある場合は、標準/エラー ストリームをファイルにリダイレクトするか、コンソールに新しいウィンドウを開かないように指示するオプションを使用できます。
于 2021-01-25T16:08:48.330 に答える