Как открыть файл JavaFX .jar с JDK 11? - PullRequest
0 голосов
/ 29 ноября 2018

Я создал проект JavaFX в IntelliJ.Я могу запустить проект в IntelliJ.Я добавил код ниже в Конфигурации):

--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml

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

java  --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java  --module-path %PATH_TO_FX% --add-modules javafx.controls  Timer.jar

Последний журнал ошибок командной строки:

Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib

ps: я мог запустить файл .jar этого проекта, когдасборка на JDK-10

EDIT :

Я загрузил JavaFX и добавил его папку lib в системную среду.для добавления JavaFX в проект я сделал этот процесс: Структура проекта> Библиотеки> add> Java> JavaFxPath / lib

Затем я создал Artifect для выходного файла JAR в этом процессе: Структура проекта> Артефакты> Добавить> JAR> ОтМодули с зависимостями> main Class: main.Main.

1 Ответ

0 голосов
/ 29 ноября 2018

Если у вас есть простой (немодульный) проект JavaFX 11 (без инструментов сборки Maven / Gradle), и вы используете IntelliJ, как пример HelloFX из здесь , вот как вы можете создатьjar от IntelliJ, который можно запустить из консоли

Полное руководство по запуску проекта можно найти здесь , а инструкции по созданию jar здесь (см. Раздел Немодульный проект), но они не охватывают Artifacts от IntelliJ.

Убедитесь, что проект HelloFX запускается из IntelliJ со следующими параметрами виртуальной машины:

--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml

, где PATH_TO_FX был установлен в File -> Settings -> Appearance & Behavior -> Path Variables, указывая на JavaFX SDK lib.

Полу жирная банка

Мы можем создать Jar-файл, который содержит только классы из проекта и сторонние зависимости, но не зависимости JavaFX.

Перейдите на File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies, добавьте свой основной класс, примите.

Затем удалить JavaFX jars из списка и принять.

SemiJar

Создайте проект, он создаст довольно маленькую банку (в данном случае 3 КБ).

Теперь вы сможете запустить его следующим образом:

java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar

(убедитесь, что %PATH_TO_FX% указывает на допустимую папку и используйте кавычки, если она содержит пробелы.

Вы можете распространять этот jar-файл и запускать его на других платформах, предоставляя такжеиметь JavaFX SDK.

Fat Jar

Если вам нужен полный полный Jar-файл с зависимостями JavaFX, вы все равно можете использовать Artifacts.

Goк File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies, добавьте свой основной класс, примите.

Затем оставьте JavaFX jars из списка и примите.Создайте проект.

Теоретически вы можете запустить его следующим образом:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar

Но это не сработает.

Причина 1: Вам нуженкласс запуска, как объяснено здесь .

Итак, создайте класс запуска:

public class Launcher {

    public static void main(String[] args) {
        Main.main(args);
    }
}

Причина 2: Если вы добавляете только свои SDK-баночки в толстую банку, выбудут отсутствовать собственные библиотеки, как объяснено здесь .

Поэтому отредактируйте артефакт, выберите класс Launcher в качестве основного класса и добавьте собственные библиотеки (Directory Content -> path-to/JavaFX SDK/bin в Windows):

Fat Jar

Теперь соберите проект (теперь jar составляет около 33 МБ и содержит ненужные собственные библиотеки) и запустите:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar

Вы можете распространять этот jar-файл, но только для платформ Windows.

Вы можете создавать подобные jar-файлы для других платформ, если вы загружаете их JavaFX SDK, а также можете создавать кроссплатформенные jar-файлы, если вы добавляете их все вместе, как объяснено в связанных ответах выше.

В любом случае, вам следует рассмотреть возможность использования jlink вместо .

Примечание

Об этой ошибке:

Причина: java.lang.ClassNotFoundException: Files \Java \ javafx-sdk-11.0.1 \ lib

похоже, что путь к библиотеке был задан без кавычек и отсутствует первая часть пути C:\Program Files\....Просто убедитесь, что вы используете кавычки:

set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"
...