Невозможно сделать основанный на модуле 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 .