java 9: ​​JLink создал недопустимые изображения - отсутствует исполняемый скрипт модуля

Я создаю образец приложения с 3 модулями user, dept и account. В моем пользовательском модуле у меня есть основной класс, и я компилирую модули с помощью следующей команды:

javac -d target --module-source-path src $(find -name "*.java")

После компиляции выполните следующую команду для запуска:

java -p target -m com.user/com.user.info.Launcher

Вывод после запуска модулей java успешен. Но при попытке создать образ среды выполнения с помощью jlink образ был успешно создан, но исполняемый скрипт модуля отсутствует. Для создания изображения я использую следующую команду:

jlink --module-path $JAVA_HOME/jmods:target --add-modules com.user --output my-app

В образе времени выполнения у меня есть каталог bin, но этот каталог содержит только сценарии java и keynote. Я также ожидаю пользовательского сценария основного класса для выполнения моего приложения.

Моя версия Java, как показано ниже:

java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+165)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode)

Как я могу решить эту проблему?


person Harmeet Singh Taara    schedule 20.05.2017    source источник
comment
Афаик jlink не создает исполняемый файл. Он просто создает образ времени выполнения виртуальной машины, в котором есть только необходимые вам модули.   -  person Jorn Vernee    schedule 20.05.2017
comment
Но в образце приветствия, который упоминается в open jdk, есть сценарий приветствия   -  person Harmeet Singh Taara    schedule 20.05.2017
comment
Можете ли вы связать место, где вы это видите? Я не вижу его здесь: openjdk.java.net/projects/jigsaw/quick -старт   -  person Jorn Vernee    schedule 20.05.2017
comment
Да, этого там нет, я думаю, что читал книгу о модульности Java 9 от http://googleweblight.com/i?u=http://shop.oreilly.com/product/mobile/0636920049494.do&grqid=q1IU6bWs&hl=en-IN&geid. На самом деле я использую много ресурсов для чтения, поэтому немного запутался   -  person Harmeet Singh Taara    schedule 20.05.2017
comment
Тем не менее, если это изображение содержит весь требуемый модуль, то почему мы не запускаем наше приложение напрямую из изображения? Если нет, как мы можем использовать изображение в нашем приложении?   -  person Harmeet Singh Taara    schedule 20.05.2017
comment
Ваш собственный модуль включен в образ. Имея двоичный файл java в папке bin, вы можете использовать java com.user.info.Launcher для запуска приложения.   -  person Jorn Vernee    schedule 20.05.2017
comment
Отличная функция, спасибо @Jorn за вашу помощь. Пожалуйста, опубликуйте свой ответ, чтобы я мог принять его.   -  person Harmeet Singh Taara    schedule 20.05.2017
comment
Рад, что смог помочь :)   -  person Jorn Vernee    schedule 20.05.2017


Ответы (1)


jlink создает образ виртуальной машины времени выполнения, в который входят только необходимые модули.

Поскольку вы указали --add-modules com.user, изображение будет включать модуль com.user и все модули, от которых он (прямо или косвенно) зависит.

Вы можете запустить свое приложение, используя двоичный файл java в папке bin сгенерированного образа и используя команду:

java com.user.info.Launcher

Вы также можете jlink создать сценарий запуска, используя параметр --launcher <command>=<module>/<main>. В вашем случае вы могли бы сделать что-то вроде:

jlink --module-path $JAVA_HOME/jmods:target --add-modules com.user --output my-app --launcher launch=com.user/com.user.info.Launcher

И после этого вы можете просто использовать launch из каталога bin для запуска приложения.

person Jorn Vernee    schedule 20.05.2017
comment
Спасибо @Jorn, Java всегда круто - person Harmeet Singh Taara; 20.05.2017
comment
@HarmeetSinghTaara Я нашел то, что вы описываете. Я попробовал кое-что и обнаружил, что есть опция --launcher для создания сценария запуска с jlink. Я добавил к ответу некоторую информацию. - person Jorn Vernee; 20.05.2017