Java11 / JavaFX11 / Модуль Deployment Mess (Runnable Jar, который работает при нажатии, но не при запуске из командной строки) - PullRequest
0 голосов
/ 09 февраля 2019

Я новичок в Java11 / все слишком сложный модуль модуля.

Проблема

Итак, я экспортировал свою программу Java11 / JavaFX11 из Eclipse как Runnable JAR.Если я нажимаю JAR, он работает отлично (Eclipse включает все настройки модуля и сам JavaFX автоматически в исполняемый JAR).Однако, если я пытаюсь связать JAR с JRE и запустить его через командную строку со следующим BAT-файлом:

@ECHO OFF %~dp0\jre\bin\java -jar javaprogram.jar pause

, я получу:

Error: JavaFX runtime components are missing, and are required to run this application Press any key to continue . . .

Как мне заставить его просто запустить файл JAR, как он делает, когда я щелкаю по нему?

Способы, которые я пытался исправить это

Самая странная часть, если я просто использую:

java -jar javaprogram.jar

, который просто обращается к установленной JRE, он снова работает.Только когда я прямо указываю на JRE по определенному пути, он кажется сломанным.

В качестве альтернативы, я бы просто связал JavaFX рядом с JRE, но, похоже, не существует способачтобы позвонить --module-path с относительным путем (поиск в Google это дает мне кучу совершенно не связанных вещей).Кажется, требуется точный путь, который не будет работать, если люди скачивают и распаковывают zip-архив.Это было бы избыточно, потому что Eclipse уже упаковывает JavaFX с JAR.Я не знаю, почему это смущает только потому, что я звоню из командной строки.

Код проекта

Проект, который я пытаюсь получитьЭто работает с открытым исходным кодом, поэтому вы можете проверить код здесь:

https://github.com/SkyAphid/JDialogue

Основной класс - JDialogueCore.

Закрытие

Я не хочу использовать установщики, так как считаю, что это слишком ненормально.Я хотел бы иметь возможность развертывать свое программное обеспечение, как всегда, просто помещая его в архив, который вы можете извлечь и запустить.

Трудно просто погуглить проблемы Google, поскольку я продолжаю получать совершенно не связанные результатыиз-за широты темы.Будем весьма благодарны за любые указания / документы, касающиеся этой проблемы.

Спасибо за потраченное время!

1 Ответ

0 голосов
/ 11 февраля 2019

В то время как Java 8, 9 и 10 позволили подклассу JavaFX Application выступать в качестве основного класса для запуска программы, это больше не относится к Java 11. Размещение вашего public static void main метода вдругой класс и превращение этого класса в основной класс решает проблему.(Источник: https://github.com/javafxports/openjdk-jfx/issues/236)

При вызове командной строки необходимо указать как расположение файлов jar JavaFX, так и расположение собственных библиотек JavaFX. Обычно это одно и то же расположение в JavaFX SDK, но они должныуказываются по-разному: файлы JAR идут по пути к классам или по модулю, а расположение собственных библиотек должно быть указано в системном свойстве:

cd /d %~dp0
jre\bin\java -cp javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib com.example.MyNonApplicationClass

Если вы определили module-info.java в своей программеваш .jar является модульным .jar, и вы можете воспользоваться дополнительной защитой модулей:

cd /d %~dp0
jre\bin\java --module-path javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib -m com.example.myapp/com.example.MyNonApplicationClass

Если в модульном файле .jar определен основной класс, вы можете опустить имя класса:

cd /d %~dp0
jre\bin\java --module-path javaprogram.jar;javafx-sdk-11\lib -Djava.library.path=javafx-sdk-11\lib -m com.example.myapp

Обратите внимание, что относительные пути прекрасно работают с --module-path. Относительные пути используют текущий каталог в качестве базы. Текущий каталог не изменяется просто путем помещения %~dp0 перед вызовом Java.Текущий каталог является свойством активно работающей командной строки или сценария, и его можно изменить только с помощью команд, подобных cd илиpushd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...