如何使用JRE部署JavaFX11桌面应用程序

如何使用JRE部署JavaFX11桌面应用程序,java,javafx,javafx-11,openjfx,Java,Javafx,Javafx 11,Openjfx,我有一个JavaFX(jdk8)桌面业务应用程序,它使用javawebstart进行部署。用户安装了Java8,他们只需转到URL(我的AWSLinux服务器上的公共URL)并下载/启动应用程序(使用WebStart)。通过在服务器上部署新的JAR,我也可以轻松地更新应用程序。一切正常 然而,Oracle已经停止使用Java 11的Web Start,在2018年3月的“Java客户端路线图更新”白皮书中,他们建议将JRE与应用程序捆绑在一起(“因此,应用程序与独立JRE分开分发的概念正在迅速消

我有一个JavaFX(jdk8)桌面业务应用程序,它使用javawebstart进行部署。用户安装了Java8,他们只需转到URL(我的AWSLinux服务器上的公共URL)并下载/启动应用程序(使用WebStart)。通过在服务器上部署新的JAR,我也可以轻松地更新应用程序。一切正常

然而,Oracle已经停止使用Java 11的Web Start,在2018年3月的“Java客户端路线图更新”白皮书中,他们建议将JRE与应用程序捆绑在一起(“因此,应用程序与独立JRE分开分发的概念正在迅速消失”)。我不能依靠我的用户在Java8上运行Web Start,即使他们仍然在8上运行,Oracle也需要许可证才能继续使用Java8(我没有许可证,这可能会非常昂贵,而且我更愿意与社区一起朝着JavaFX11和OpenJDK的方向发展)


我想迁移到JavaFX11。我遵循了OpenJFX的“JavaFX11入门”(Getting Started with JavaFX11),使用OpenJDK 11.0.1和Gluon的JavaFX SDK 11.0.1(在Netbeans 10vc2上),并且能够运行示例应用程序(在我看来,我应该能够非常轻松地将JavaFX8代码移植到JavaFX11)

然而,这就是我被困在方向上的地方。如何将其与JRE捆绑并部署到最终用户(并提供应用程序更新)?有没有一个简单的方法(或者甚至是一个艰难的方法,有一些方向/指南)

我可以花几百个小时在JavaFX11中编写富有表现力、丰富且有用的桌面业务应用程序,但我该怎么做呢

像JWrapper、InstallAnywhere等部署工具包是否适合Java11的新时代?Gluon/openjfx.io是否有我错过的建议或指南?对于专注于编写前端代码的美国开发人员如何部署应用程序,我似乎找不到来自知名来源的任何建议或指南


感谢您的帮助或指导。

现在的工作方式是,您将程序转换为模块,然后将其“链接”到所需的所有其他模块

这个链接过程的结果就是所谓的图像。映像实际上是一个文件树,其中包含一个
bin
目录,其中包含一个或多个准备运行的可执行文件。此树是您分发的,通常作为zip或tar.gz

这些步骤是:

  • 创建一个模块-info.java
  • 使用模块路径而不是类路径编译
  • 像往常一样,从类创建一个jar
  • 使用JDK的
    jmod
    工具将jar转换为jmod
  • 将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模块的目录。在您的情况下,这至少意味着Glion的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.BusinessApplication \
        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,它只包含显式添加的模块(以及显式模块需要的模块)<代码>--添加模块是指定要添加的内容的必需选项

    与其他JDK工具一样,
    --module path
    指定包含模块的目录

    --launcher
    选项使最终图像树在其
    bin
    目录中具有一个附加的可执行脚本,该脚本具有给定的名称(等于前面的部分)。因此,
    MyBusinessApp=com.mcs75.businessapp
    的意思是“创建一个名为MyBusinessApp的可执行文件,它执行com.mcs75.businessapp模块。”

    由于
    jmod create
    命令包含一个
    --main class
    选项,Java将知道执行什么,就像在清单中声明一个main class属性一样。如果需要,还可以在
    --launcher
    选项中显式声明要执行的类

    分发 您要分发的是整个图像文件树的zip或tar.gz。用户应该运行的可执行文件位于映像的
    bin
    目录中。当然,您可以自由添加自己的可执行文件。只要图像树的结构保持不变,您也可以将其随意放入任何类型的安装程序中

    未来的JDK将有一个创建成熟的本机安装程序的平台。从Java14开始,JDK就有了一个可以创建本机安装程序的工具。例如:

    jpackage -n MyBusinessApp --runtime-image build/image \
        -m com.mcs75.businessapp/com.mcs75.desktop.businessapp.BusinessApplication
    
    -n
    指定程序的名称<代码>--运行时映像指定现有jlink映像的位置
    -m
    是要执行的jlink映像中的模块和类,非常类似于jlink的
    --launcher
    选项中
    =
    后面的部分

    交叉建筑物 由于映像包含本机二进制文件,因此需要为每个平台创建映像。显然,一种选择是在Linux系统上构建映像,然后在Windows系统上构建映像,然后在Mac上构建映像,等等

    但是您也可以使用
    jmod
    jlinkjmod describe path-to-foreign-jdk/jmods/java.base.jmod | grep '^platform'
    
    mkdir build/modules
    jmod create --target-platform windows-amd64 \
        --class-path build/mybusinessapp.jar \
        --main-class com.mcs75.desktop.businessapp.BusinessApplication \
        build/modules/mybusinessapp.jmod
    
    jlink --output build/image \
        --module-path path-to-foreign-jdk/jmods:build/modules:/opt/gluon-javafx-windows/lib \
        --add-modules com.mcs75.businessapp \
        --launcher MyBusinessApp=com.mcs75.businessapp