web-dev-qa-db-ja.com

JREでJavaFX 11デスクトップアプリケーションをデプロイする方法

JavaFX(JDK 8)デスクトップビジネスアプリケーションがあり、Java Web Startを使用して展開します。ユーザーにはJava 8がインストールされており、URL(AWS Linuxサーバー上のパブリックURL)にアクセスするだけで、アプリケーションがダウンロード/起動します(Web Startを使用)。新しいJARをサーバーにデプロイすることで、アプリケーションも簡単に更新できます。すべてがうまく機能します。

ただし、OracleはJava 11でWeb Startを廃止し、2018年3月の「Java Client Roadmap Update」ホワイトペーパーで、JREをアプリケーションにバンドルすることを推奨しています(「アプリケーションが個別に配布されるという概念したがって、スタンドアロンJREからは急速にフェードアウトします。」)。ユーザーがWeb StartでJava 8に留まることを信頼することはできません。ユーザーが8のままであったとしても、Java 8を引き続き使用するにはライセンスが必要です持っている、非常に高価になる可能性があり、とにかくコミュニティと一緒にJavaFX 11とOpenJDKに移行することを好むでしょう。

JavaFX 11に移行したいと思います。OpenJFXの「Getting Started with JavaFX11」に従っています( https://openjfx.io/openjfx-docs/ )、OpenJDK 11.0.1をGluonのJavaFX SDK 11.0.1(Netbeans 10vc2で)を使用して、サンプルアプリケーションを実行できるようにしました(そして、私にはJavaFX 8コードをJavaFX 11に移植できるはずです)非常に簡単に)。

しかし、これは私が方向性に固執しているところです。これをJREにバンドルし、これをエンドユーザーに展開する(およびアプリケーションの更新を提供する)にはどうすればよいですか?そこに簡単な方法はありますか(または、方向/ガイドを使用して難しい方法もあります)?

JavaFX 11で表現力豊かで使いやすいデスクトップビジネスアプリケーションを書くのに何百時間も費やすことができますが、どうすればよいでしょうか?

JWrapper、InstallAnywhereなどの展開ツールキットは、Java 11のこの新しい時代に適していますか? Gluon/openjfx.ioには、おそらく私が見逃した推奨事項やガイドがありますか?フロントエンドコードの記述に重点を置いている開発者がアプリケーションをデプロイする方法について、信頼できるソースから推奨事項やガイドを見つけることができないようです。

助けやガイダンスをありがとう。

18
mcs75

現在の動作は、プログラムをモジュールに変換してから、必要な他のすべてのモジュールに「リンク」します。

このリンクプロセスの結果は、画像と呼ばれるものです。イメージは実際にはファイルツリーであり、1つまたは複数のすぐに実行可能な実行可能ファイルを含むbinディレクトリが含まれます。このツリーは、通常Zipまたはtar.gzとして配布するものです。

手順は次のとおりです。

  1. Module-info.Javaを作成します
  2. クラスパスではなくモジュールパスでコンパイルする
  3. 通常どおり、クラスからjarを作成します
  4. JDKのjmodツールを使用して、jarをjmodに変換します
  5. そのjmodとそれが依存するモジュールをイメージにリンクします

モジュール記述子の作成

最初のステップは、アプリケーションをモジュールに変えることです。最低限、ソースツリーの最上部(つまり、空のパッケージ)にmodule-info.Javaを作成する必要があります。すべてのモジュールには名前があります。これは多くの場合、パッケージ名と同じですが、そうである必要はありません。したがって、module-info.Javaは次のようになります。

module com.mcs75.businessapp {
    exports com.mcs75.desktop.businessapp;

    requires Java.logging;
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
}

建物

ビルド時には、クラスパスをまったく指定しません。代わりに、モジュールパスを指定します。

モジュールパスは、ファイルではなくディレクトリのリストです。各ディレクトリには、当然ながらモジュールが含まれます。 JDKのjmodsディレクトリは暗黙的に含まれています。含める必要があるのは、必要な非JDKモジュールを含むディレクトリだけです。あなたの場合、それは少なくともGluonのJavaFXを意味します:

javac -Xlint -g -d build/classes --module-path /opt/gluon-javafx/lib \
    src/Java/com/mcs75/desktop/businessapp/*.Java

次に、通常の方法でjarを作成します。

jar -c -f build/mybusinessapp.jar -C build/classes .

Module-info.classを含むjarファイルは、モジュラーjarと見なされます。

Jmodを作成する

通常、jmodの作成は簡単なプロセスです。

mkdir build/modules
jmod create --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

リンク

最後に、JDKのjlinkコマンドを使用してすべてを組み立てます。

jlink --output build/image \
    --module-path build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp

jlinkは、最小限のJREを作成します。これには、明示的に追加するモジュール(および明示的なモジュールに必要なモジュール)のみが含まれます。 --add-modulesは、追加するものを指定する必須オプションです。

他のJDKツールと同様に、--module-pathはモジュールを含むディレクトリを指定します。

--launcherオプションを使用すると、最終イメージツリーのbinディレクトリに、指定された名前(等しい前の部分)を持つ追加の実行可能スクリプトが作成されます。したがって、MyBusinessApp=com.mcs75.businessappは、「モジュールcom.mcs75.businessappを実行するMyBusinessAppという名前の実行可能ファイルを作成する」ことを意味します。

jmod createコマンドには--main-classオプションが含まれていたため、マニフェストでMain-Class属性を宣言するのと同じように、Javaは実行する内容を認識します。必要に応じて、--launcherオプションで実行するクラスを明示的に宣言することもできます。

配布中

配布するのは、イメージファイルツリー全体のZipまたはtar.gzです。ユーザーが実行する実行可能ファイルは、画像のbinディレクトリにあります。もちろん、独自の実行可能ファイルを自由に追加できます。また、画像ツリーの構造が保持されている限り、これを任意の種類のインストーラーに自由に配置できます。

将来のJDKには、本格的なネイティブインストーラーを作成するための パッケージングツール が含まれます。

クロスビル

イメージにはネイティブバイナリが含まれているため、プラットフォームごとにイメージを作成する必要があります。明らかに、1つのオプションは、Linuxシステムでイメージをビルドし、Windowsシステムで再度ビルドし、Macなどでイメージをビルドすることです。

ただし、jmodおよびjlinkを使用して、どこに構築しているかに関係なく、他のプラットフォーム用の画像を作成することもできます。

必要な追加の手順はいくつかあります。まず、他のプラットフォーム用のJDKが必要です。それらをインストーラーではなくアーカイブ(Zipまたはtar.gz)としてダウンロードし、選択したディレクトリに展開します。

各JDKはplatform文字列を定義します。これは通常、<os>-<Arch>という形式です。プラットフォームはJava.baseモジュールのプロパティです。そのモジュールを調べることで、JDKのプラットフォームを確認できます。

jmod describe path-to-foreign-jdk/jmods/Java.base.jmod | grep '^platform'

--target-platformオプションを使用して、そのプラットフォーム文字列をjmodコマンドに渡します。

mkdir build/modules
jmod create --target-platform windows-AMD64 \
    --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

最後に、リンクするときに、他のJDKのjmodsディレクトリを明示的に含める必要があるため、jlinkは暗黙的に独自のJDKのモジュールを含めません。

jlink --output build/image \
    --module-path path-to-foreign-jdk/jmods:build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp
15
VGR

José:同じ問題を解決する必要があると思います( Windows上のJavaFXアプリの自己完結型アプリケーションパッケージ:InnoSetup OR javafxpackager? で私の質問を参照してください)。おそらく、JDKのjavapackagerを使用すると、多数のパラメーターがあるにもかかわらず、「簡単な」ソリューションになります。私の場合、このツールによって「Windows上のJavaFXアプリ用の自己完結型アプリケーションパッケージ」を生成することに成功しましたか?

0
Pascal DUTOIT