Ошибка при попытке упаковать собственное изображение с помощью javapackager в java 9-ea?

Я пробую 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

Мой модуль-info.java:

module my.module {
    requires javafx.graphics;
    requires javafx.fxml;
    exports sample;
}

Сначала я создаю банку с javapackager, которая отлично работает:

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)


person jbilander    schedule 01.08.2017    source источник
comment
у вас установлена ​​Inno Setup 5 и доступна через PATH? См. параграф 7.4.1 здесь docs. oracle.com/javase/8/docs/technotes/guides/deploy/   -  person madduci    schedule 29.08.2017
comment
Да, у меня есть, и теперь также добавлено редактирование 2, где вы можете увидеть результат работы с флагом -native exe вместо -native image. Ошибка не связана с InnoSetup. NullPointerException в той же строке, независимо от того, какой флаг используется (image/exe/dmg/deb/rpm). Я сообщил об ошибке в Oracle...   -  person jbilander    schedule 29.08.2017
comment
это похоже на ошибку в Windows. В Linux одна и та же команда может генерировать deb,rpm,images. Кстати, вы можете собрать пакет только на определенных системах (например, DEB/RPM только на Linux, EXE/MSI только на Windows, DMG только на Mac)   -  person madduci    schedule 30.08.2017
comment
Я бы сказал, что это выглядит как ошибка независимо от платформы, см. редактирование 3...   -  person jbilander    schedule 30.08.2017
comment
Довольно грустно, что ошибка была закрыта, так как это не проблема с этим запутанным сообщением об ошибке и с дополнительной необходимостью перетасовки файлов и каталогов для получения чистой структуры пути к модулю (вместо того, чтобы просто пинкнуть файл *.jar, как jlink может). Вы пытались связаться со списком рассылки openjdk?   -  person eckes    schedule 16.03.2018
comment
нет, я никогда не пытался связаться с кем-либо из списка рассылки openjdk по этому вопросу. Я согласен с вами, было бы неплохо, если бы файл *.jar можно было указать в пути к модулю, как вы можете сделать в jlink.   -  person jbilander    schedule 19.03.2018


Ответы (1)


Отвечая на мой собственный вопрос здесь (после получения ответа на отчет об ошибке):

Оказывается, путь к модулю должен содержать только имена каталогов, а не имена файлов, поэтому вы не можете указать банку в пути, как вы можете с помощью команды jlink. 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. Однако я обнаружил, что на самом деле вы можете заменить содержимое папки среды выполнения, созданной с помощью javapackager, выводом команды jlink, что значительно уменьшит размер сборки, а MyTestApp.exe работает при вызове! Я также мог бы удалить java.exe и javaw.exe из замененной папки runtime\bin, а также msvcp120.dll и msvcr120.dll из основной папки MyTestApp, поскольку эти dll уже находятся в папке MyTestApp\runtime\bin.

MyTestApp-структура папок:

структура папки.

person jbilander    schedule 05.09.2017
comment
вместе с пути модуля к вашим файлам Java вы также должны связать путь к папке Java jmods: --module-path C:\Java9Test\target\classes;C:\Program Files\Java\jdk-9\jmods - person madduci; 06.09.2017
comment
На самом деле в этом нет необходимости, так как путь к jmods подбирается javapackager автоматически. Однако при запуске команды jlink это необходимо сделать. - person jbilander; 06.09.2017