我正在尝试java 9-ea(jdk-9 + 180)和新的javapackager从一个简单的模块创建一个本机图像,但我得到一个nullpointer异常。任何人都知道我是不是太早或者我没有使用正确的命令开关才能让它工作? jlink命令工作正常,但javapackager没有。我在撰写本文时使用的是最新的jdk-9 + 180。我已尝试使用-native exe
和-native image
开关,但会出现相同类型的错误。我也在我的Mac上尝试使用-native dmg
开关创建本机dmg,但在该平台上出现相同的错误。我真的在这里使用javapackager之后能够在exe/dmg
中捆绑构建。
编辑1: 我已经提交了有关此问题的错误报告,现在可以在以下网址上看到它:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8186661
我的module-info.java:
module my.module {
requires javafx.graphics;
requires javafx.fxml;
exports sample;
}
首先我用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)
答案 0 :(得分:4)
在这里回答我自己的问题(收到错误报告的答复后):
事实证明,module-path必须只包含目录名,而不是文件名,因此你不能像使用jlink命令那样在路径中指定jar。如果将javapackager设置为如下所示的已编译模块类,则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
和--strip-debug
标记,因为jlink
可以使用MyTestApp.exe
和java.exe
标记。但是,我发现您实际上可以使用jlink命令的输出替换使用javapackager生成的运行时文件夹的内容,从而使构建的占用空间小得多,javaw.exe
在调用时可以正常工作!我还可以从已更换的runtime\bin
文件夹以及主msvcp120.dll
- 文件夹中的msvcr120.dll
和MyTestApp
中删除MyTestApp\runtime\bin
和MyTestApp
因为那些dll:s已经在df[ df == quantile(d$value, 0.95), ] <- NA
文件夹中。
missing values and NaN's not allowed if 'na.rm' is FALSE
- 文件夹结构: