Невозможно сделать основанный на модуле jar с 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) без сообщений об ошибках. Но я получаю сообщение об ошибке при попытке выполнить jar с помощью обычной команды:

java -jar tcdmod.jar

Ошибка: не удалось найти или загрузить основной класс moduleTCD.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 работал нормально в этом случае.

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

    Ява -m moduleTCD/com.adonax.tanpura.TCDLaunch

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

1 ответ

Решение

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

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

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

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

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

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

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 .
Другие вопросы по тегам