Как найти автоматические модули с помощью javapackager

Я связываю приложение, используя javapackager где основной jar является модулем с module-info.class, но он опирается на многие другие jar, которые являются простыми старыми jar, поэтому я вызываю их как автоматические модули в module-info.java. Тем не мение, javapackager жалуется, что не может их найти. Как мне найти файлы jar для автоматических модулей?

Exception: jdk.tools.jlink.plugin.PluginException: java.lang.module.FindException: Module rcf not found, required by com.username.commander.ui
Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "Mac Application Image" (mac.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)

Я попытался указать путь к модулю (первый каталог содержит только основной модуль jar, второй каталог содержит все немодульные файлы jar):

/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/javapackager -deploy -native image \
-name Commander -title Commander -vendor "username" \
--module-path /Users/username/Dropbox/coding/commander/Commander-java/moduleJars:/Users/username/Dropbox/coding/commander/Commander-java/packageJars \
--module com.username.commander.ui/com.username.commander.ui.AppWindow \
-srcdir /Users/username/Dropbox/coding/commander/Commander-java/packageJars \
-outdir /Users/username/Dropbox/coding/commander/Commander-java/target \
-outfile Commander \
-Bruntime=target/jre-9.0.1 -Bicon=src/main/resources/icons/commander.icns \
-BappVersion=1.0 \
-Bmac.CFBundleIdentifier=com.username.Commander \
--add-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
--limit-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
-nosign -v

2 ответа

Поэтому после дополнительных исследований я подтвердил ответ nullpointer: автоматические модули просто не поддерживаются из-за их доступа к пути к классам, что нарушает модульность модулей Java 9. Более подробную информацию можно найти в этом обсуждении около года назад: http://mail.openjdk.java.net/pipermail/jigsaw-dev/2016-July/008559.html

Так что пока Oracle и сообщество Java не решат, как с этим бороться, javapackager в Java 9 не позволят вам использовать автоматические модули. Если вы связываете приложение, которое использует модуль, все ваши зависимости также должны быть модулями. Если вам требуются немодульные зависимости, то вы должны сделать все ваши jar-файлы немодульными. Если вы делаете свой jar (s) модульным, то вы должны сделать все свои зависимости модульными, что может быть большой работой или невозможным, если у вас нет этих зависимостей.

Если вы сделаете все немодульным, недостатком, конечно, будет то, что вы не получите преимущества более тонкого времени выполнения, которое включает только те модули, которые вам нужны. Для этого есть обходной путь.

Если посмотреть дальше, то представляется, что исключение представляется оправданным в его реализации над автоматическими модулями, но, как представляется, сообщение замаскировано, как указано в BUG # JDK-8189671.

Похоже, что плагин сообщает, что автоматический модуль используется как root из-за отсутствия module-info.class ресурс! jlink должен обнаружить попытку использовать автоматический модуль в качестве привилегированного пользователя и четко сообщить об ошибке.

Следовательно, вы должны указать --module-path вместо модульных банок.

Дополнительное примечание: инструменты упаковки Java (javapackager) использовать jlink инструмент для создания пользовательских JRE для приложения.

Другие вопросы по тегам