Ограничение модулей, добавленных javapackager

Я пытаюсь уменьшить размер своего приложения, ограничивая модули, которые оно включает. Я уже сделал это для своей среды выполнения, используя jlink. Однако, когда я запускаю javapackager с параметрами --add-modules и --limit-modules с разделенным запятыми списком того же небольшого набора модулей, который я использовал для среды выполнения, он все равно настаивает на добавлении всех модулей. Похоже, он не хочет соблюдать вариант, который я ему даю. Как я могу получить инструмент для ограничения модулей, которые он добавляет в мой пакет приложений?

"Adding modules: [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, 
    java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets, jdk.xml.dom, 
    java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec, 
    jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject, jdk.sctp, java.smartcardio, 
    jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink, 
    javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr, jdk.packager.services, jdk.net, javafx.controls, 
    java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management, 
    jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata] to runtime image."
outputDir = ...
modulePath = [/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/jmods]
addModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets, 
    jdk.xml.dom, java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec, jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject, 
    jdk.sctp, java.smartcardio, jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink, javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr, 
    jdk.packager.services, jdk.net, javafx.controls, java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management, jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata]
limitModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation]

Вот команда, которую я запускаю, с заменой некоторых вещей, таких как имя пользователя:

/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/javapackager -deploy -native image \
-name Commander -title Commander -vendor "username" \
-appclass 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 \
-BmainJar=commander-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
--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

person GabeV    schedule 22.10.2017    source источник
comment
Что, если вы укажете -BmainJar=commander-0.0.1-SNAPSHOT-jar-with-dependencies.jar вместо -srcfiles commander-0.0.1-SNAPSHOT-jar-with-dependencies.jar?   -  person Naman    schedule 23.10.2017
comment
Хех, я попробовал это, и это дает мне другую ошибку, что srcfiles не может содержать файлы с информацией о модулях. Это вызвало еще один вопрос, о котором вы также знаете :)   -  person GabeV    schedule 23.10.2017


Ответы (2)


Итак, получается, что причина, по которой он не соблюдал мои параметры, заключается в том, что мой jar приложения не является модулем Java 9. Это обычная старая банка. В Java 9 javapackager использует jlink для создания среды выполнения и не будет пытаться ограничить количество модулей, поскольку не может определить зависимости модулей. Параметр -Bruntime предназначен только для приложений Java Web Start. Если вы хотите, чтобы javapackager не использовал jlink, вы должны использовать тот, что в JDK 8.

Я не могу превратить свою банку приложения в модуль из-за сложности, связанной со всеми сторонними зависимостями (вы можете увидеть подробности в этом вопросе). И я не могу использовать JDK 8, потому что мне нужно, чтобы некоторые API-интерфейсы были добавлены в модуль рабочего стола в Java 9. Итак, я нашел обходной путь, чтобы получить более тонкое время выполнения в приложении с помощью Java 9 javapackager:

  1. Создайте более тонкую среду выполнения, используя jlink, указав только те модули, которые вам нужны, с помощью параметра --add-modules. Вы можете использовать команду jdeps, чтобы выяснить, какие модули нужны всем jar-файлам в вашем приложении.
  2. Создайте .app с полной средой выполнения, используя javapackger, как обычно.
  3. Откройте сгенерированный файл .app (macOS) или для Windows используйте что-то, что позволит вам редактировать установщик .exe или .msi (сам не знаю, как это сделать).
  4. В macOS замените содержимое <myApp>.app/Contents/PlugIns/Java.runtime/Contents/Home на содержимое вашей более тонкой среды выполнения. Сделайте что-то подобное для установщика Windows.
person GabeV    schedule 24.10.2017
comment
вы не можете создать небольшую среду выполнения jlink напрямую с помощью javapackager? - person Tiago Santos; 15.11.2017
comment
На основании моего открытия для этого требуется, чтобы ваше приложение использовало только модули Java 9. Если вы используете какие-либо немодульные jar-файлы, они включают в себя всю среду выполнения Java 9. Именно это я и пытался описать в первом абзаце. - person GabeV; 16.11.2017
comment
Можете ли вы опубликовать пример для macOS? - person balthisar; 25.03.2018

Используя командную строку javapackager, вы можете использовать развернуть параметры --limit-modules и --add-modules, такие как:

javapackager -deploy 
    --add-modules java.base,java.desktop... 
    --limit-modules java.base,java.desktop,java.naming...
    --module-path your.mods.dir
    -native -outdir OUTPUT_DIR -outfile APPLICATION_NAME 
    -srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
    -name "YourApplication" -title "SelfContained"

Или, в просторечии, задача развертывания муравья будет состоять из чего-то вроде:

<fx:runtime strip-native-commands="false">
    <fx:add-modules value="java.base"/>
    <fx:add-modules value="java.desktop,java.naming..."/>
    <fx:limit-modules value="java.base"/>
    <fx:limit-modules value="java.desktop,java.naming..."/>
    <fx:module-path value="${java.home}/../images/jmods"/>
    <fx:module-path value="${build.dir/modules"/>
</fx:runtime>
person Naman    schedule 22.10.2017
comment
Спасибо, но, как я уже говорил, я уже использую эти опции. Проблема в том, что их не уважают. - person GabeV; 22.10.2017
comment
@GabeV Не могли бы вы поделиться точной командой / задачей, использованной вами в этом случае, и какую ошибку / вывод вы получили? - person Naman; 23.10.2017
comment
Не получая никаких ошибок. Вывод, который я вставил, показывает, что он просто возвращается к добавлению всех модулей. Я отредактировал вопрос с помощью команды, которую я запускаю. Одна возможность, которая приходит мне в голову, заключается в том, что основной jar для пакета не является jar-модулем. Я думаю, что это мешает ему использовать только указанные модули. Я пытаюсь преобразовать его в банку модулей, чтобы подтвердить, но у меня другие проблемы. - person GabeV; 23.10.2017