Как найти автоматические модули с помощью 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 для приложения.