невозможно создать банку на основе модуля с помощью javapackager

Я новичок в javapackager и Java 9 и работаю над примерами в javapackager, первый пример показан ниже:

Пример 1. Использование команды -createjar

javapackager -createjar -appclass package.ClassName
  -srcdir classes -outdir out -outfile outjar -v

Packages the contents of the classes directory to outjar.jar, 
sets the application class to package.ClassName.

Я могу сделать файл jar (tcdmod.jar) без сообщений об ошибках. Но я получаю сообщение об ошибке, когда пытаюсь выполнить банку с помощью обычной команды:

java -jar tcdmod.jar

Ошибка: не удалось найти или загрузить модуль основного классаTCD.com.adonax.tanpura.TCDLaunch. Причина: java.lang.NoClassDefFoundError: com/adonax/tanpura/TCDLaunch (неправильное имя: moduleTCD/com/adonax/tanpura/TCDLaunch)

Команда, используемая для создания банки:

javapackager -createjar -appclass moduleTCD/com.adonax.tanpura.TCDLaunch
-srcdir compiled -outdir outex1 -outfile tcdmod -v

Папка для компиляции:

compiled/moduleTCD/com/adonax/tanpura/ [compiled classes here and below]
compiled/moduleTCD/module-info.class

Манифест в банке показывает:

Main-Class: moduleTCD/com.adonax.tanpura.TCDLaunch

Вещи, которые я пытался решить до сих пор:

  • Я не мог сказать из документации, правильно ли я указал параметр -appclass. Документация определяет -appclass следующим образом: «Полное имя класса приложения, которое должно быть выполнено». Но я не вижу никаких указаний на то, что подразумевается под «квалифицированным». Я попробовал несколько разных имен, которые показались правдоподобными. Форма с именем модуля, которую я использовал, верна?

  • Я создал второй «скомпилированный» каталог, в котором модуль был просто исключен из проекта, и повторил команду, используя ее для моего -srcdir. В этом случае полученный файл jar работал нормально.

  • Я проверил, что могу запустить программу из командной строки, используя скомпилированный источник (из «скомпилированной» папки):

    джава -р . -m модульTCD/com.adonax.tanpura.TCDLaunch

Какие-нибудь мысли? Чтобы сделать автономный exe-пакет (основная цель), мне нужен файл jar на основе модуля, если я правильно читаю документацию.


person Phil Freihofner    schedule 08.05.2018    source источник


Ответы (1)


Наконец-то я понял это, внимательно изучив синтаксис команды jar. (Что-то, чего я никогда не делал в прошлом, благодаря тому, что Eclipse IDE обрабатывает это автоматически.)

Вот что я обнаружил и исправил.

1) Аргумент -appclass должен быть расположением основного пакета и не включать модуль, в котором находится пакет.

Таким образом, я изменил аргумент с «moduleTCD/com.adonax.tanpura.TCDLaunch» на «com.adonax.tanpura.TCDLaunch».

2) Аргумент -srcdir должен быть папкой модуля (содержащей module-info.class). Таким образом, я изменил аргумент с «скомпилировано» на «скомпилировано/src/moduleTCD».

Итак, для моей конкретной ситуации (только один модуль, никаких дополнительных банок или библиотек для подключения) следующая команда (в виде одной строки) работала правильно.

javapackager -createjar -appclass com.adonax.tanpura.TCDLaunch -srcdir
compiled/src/moduleTCD -outdir outex1 -outfile tcdmod -v

Вот (однострочная) команда jar, которая также работает.

jar -cfe outex1.tcdmod.jar com.adonax.tanpura.TCDLaunch -C 
compiled/src/moduleTCD .
person Phil Freihofner    schedule 09.05.2018