尝试在 java 9-ea 中使用 javapackager 打包本机映像时出错?

jbi*_*der 3 javafx java-9 javapackager

我正在尝试 java 9-ea (jdk-9+180) 和新的 javapackager 从简单模块创建本机映像,但出现空指针异常。有人知道我是否太早了或者我是否没有使用正确的命令开关来使其工作?jlink 命令工作正常,但 javapackager 却不行。在撰写本文时,我正在使用最新的 jdk-9+180。我已尝试使用-native exe-native image开关,但出现了相同类型的错误。我也在我的 Mac 上尝试过使用交换机创建本机 dmg -native dmg,但在该平台上出现了相同的错误。我真的很想在这里使用 javapackager 来将构建捆绑到exe/dmg.

编辑 1: 我已经提交了有关此问题的错误报告,现在可以在以下网址中看到该报告:http://bugs.java.com/bugdatabase/view_bug.do ?bug_id=JDK-8186661

我的模块信息.java:

module my.module {
    requires javafx.graphics;
    requires javafx.fxml;
    exports sample;
}
Run Code Online (Sandbox Code Playgroud)

首先,我使用 javapackager 创建一个运行良好的 jar:

C:\Java9Test\target>javapackager -createjar -appclass sample.Main -srcdir classes -outdir . -outfile myjar -v

我已经验证了生成的 jar 结构看起来与正确编译的module-info.class以及其中的其他两个类没有问题。

以下 jlink 命令可以工作并生成可运行的简化运行时映像:

C:\Java9Test\target>jlink --output release\MyTestApp --compress=2 --module-path "myjar.jar;C:\Program Files\Java\jdk-9\jmods" --add-modules my.module

但是,当尝试以下命令以使用 javapackager 创建本机映像时失败:

C:\Java9Test\target>javapackager -deploy -v -outdir packages -name MyTestApp -native image --module-path "myjar.jar;C:\Program Files\Java\jdk-9\jmods" --add-modules my.module --module my.module/sample.Main

输出:

Running [C:\Program Files\Java\jdk-9\bin\java.exe, -version] Creating app bundle: MyTestApp in C:\Java9Test\target\packages Exception: java.lang.NullPointerException Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "Windows Application Image" (windows.app) failed to produce a bundle. at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374) at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348) at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)

编辑2:

标志的输出-native exe(在 Windows 上)

Running [C:\Program Files\Java\jdk-9\bin\java.exe, -version] Running [C:\Program Files (x86)\Inno Setup 5\iscc.exe, /?] Detected [C:\Program Files (x86)\Inno Setup 5\iscc.exe] version [5] At least one type of shortcut is required. Enabling menu shortcut. Exception: java.lang.NullPointerException Config files are saved to C:\Users\Username\AppData\Local\Temp\fxbundler17330843784617821035\windows. Use them to customize package. Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "EXE Installer" (exe) failed to produce a bundle. at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374) at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348) at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)

编辑3:

标志的输出-native dmg(在 MacOSX 上)

Building DMG package for MyTestApp Exception: java.lang.NullPointerException Config files are saved to /var/folders/qs/nk3vxsx90q9_pbjs0ypg74r40000gn/T/fxbundler3765252041328710759/macosx. Use them to customize package. Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "DMG Installer" (dmg) failed to produce a bundle. at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374) at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348) at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)

标志的输出-native deb(在 Linux Mint 上)

Running [dpkg-deb, --version] Debian packages should specify a license. The absence of a license will cause some linux distributions to complain about the quality of the application. Exception: java.lang.NullPointerException Config files are saved to /tmp/fxbundler2941553392593775128/linux. Use them to customize package. Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "DEB Installer" (deb) failed to produce a bundle. at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374) at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348) at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)

标志的输出-native rpm(在 Linux Mint 上)

Running [rpmbuild, --version] At least one type of shortcut is required. Enabling menu shortcut. Exception: java.lang.NullPointerException Config files are saved to /tmp/fxbundler2278571164448075269/linux. Use them to customize package. Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "RPM Bundle" (rpm) failed to produce a bundle. at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374) at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348) at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)

jbi*_*der 5

在这里回答我自己的问题(在收到错误报告的答复后):

事实证明,模块路径必须只包含目录名,而不包含文件名,因此您不能像使用 jlink 命令那样在路径中指定 jar。如果设置为编译的模块类,javapackager 会使用模块路径,如下所示,您也不需要将模块路径放入 jmods 目录,因为它会自动获取。

C:\Java9Test\target>javapackager -deploy -v -outdir packages -name MyTestApp -native image --module-path C:\Java9Test\target\classes --module my.module/sample.Main

但是,生成的构建的可执行文件MyTestApp.exe对我不起作用,调用(双击)时没有任何反应。此外,构建相当庞大,似乎您还不能像使用 那样使用--compress=2和标志。然而,我发现您实际上可以用 jlink 命令的输出替换 javapackager 生成的运行时文件夹的内容,从而使构建的占用空间小得多,并且在调用时可以正常工作!我还可以从替换的文件夹以及主文件夹中删除和,因为这些 dll:s 已经在该文件夹中。 --strip-debugjlinkMyTestApp.exejava.exejavaw.exeruntime\binmsvcp120.dllmsvcr120.dllMyTestAppMyTestApp\runtime\bin

MyTestApp- 文件夹结构:

文件夹结构