Как добавить среду выполнения javaFx к затмению на java 11?

Я получаю следующую ошибку, поскольку Java 11 исключил JavaFX как часть последней версии.

Error: JavaFX runtime components are missing, and are required to run
this application

Спасибо

1 ответ

Решение

Следуя руководству по началу работы, это необходимые шаги для запуска JavaFX 11 из Eclipse.

1 Установите Eclipse 2018-09 отсюда.

2 Установите JDK 11 отсюда.

3 Добавьте Java 11 в качестве установленной JRE в Eclipse: Eclipse -> Window -> Preferences -> Java -> Installed JREs -> Add.

4 Загрузите JavaFX 11 ea отсюда.

5 Создайте пользовательскую библиотеку: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. Назовите его JavaFX11 и включите файлы jar в папку lib из JavaFX 11-ea.

6 Создайте проект Java. Вам не нужно добавлять класс модуля-пути. Убедитесь, что вы выбрали Java 11 и добавили библиотеку JavaFX11 в путь модуля проекта.

7 Добавить пакет javafx11 и основной класс приложения HelloFX:

package javafx11;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        String version = System.getProperty("java.version");
        Label l = new Label ("Hello, JavaFX 11, running on "+version);
        Scene scene = new Scene (new StackPane(l), 300, 200);
        stage.setScene(scene);
        stage.show();
    }

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

}

Обратите внимание, что редактор не должен жаловаться на классы JavaFX, так как мы включили пользовательскую библиотеку.

8 Добавьте аргументы времени выполнения. Отредактируйте конфигурацию запуска проекта и добавьте следующие аргументы VM:

--module-path C:\Users\<user>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls

9 Наконец, запустите проект. Это должно работать нормально.

Я хотел бы поделиться своими выводами о запуске приложения javafx 11. Я говорю о существующем унаследованном приложении javafx, изначально разработанном без модулей (например, w/ Java 8).

Наиболее интересным способом IMO является метод № 2b, приведенный ниже, который требует минимума изменений, т.е. -module-path аргумент. Я упоминаю, что я использую Maven, поэтому ср. предыдущие ответы первым шагом является добавление зависимости в ваш pom.xml в сторону javafx. Например:

<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-controls</artifactId>
  <version>11.0.2</version>
</dependency>

Для запуска я нашел несколько вариантов:

1a) Запустить используя maven из командной строки

Настроить в своем pom.xml раздел как:

    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>org.openjfx.hellofx.MainApp</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

После этого из окна консоли вы можете запустить mvn exec:java и это должно запустить приложение. Maven позаботится о добавлении всех записей из classpath в путь к модулю. Я напоминаю CTRL + ALT + T ярлык в Eclipse, который открывает окно терминала прямо в IDE.

1b) Запуск с использованием Maven, но в качестве конфигурации запуска Eclipse

Щелкните правой кнопкой мыши по проекту> Run As> Maven Build.... Затем введите exec:java в текстовом поле Цели. Преимущество по сравнению с предыдущим методом: немного более интегрированный в Eclipse. И легкая отладка. Вам нужно только перезапустить конфигурацию запуска в режиме отладки и все. Могу ли я напомнить, что конфиги запуска Eclipse могут быть сохранены как .launch файлы непосредственно в проекте dir (репо), поэтому коллеги могут совместно использовать их. Используйте последнюю вкладку Common в окне Edit Configuration.

2a) Запустить с использованием Eclipse и указать -module-path используя переменную

Щелкните правой кнопкой мыши основной класс> Запуск от имени> Java-приложение. При первом щелчке создается новая конфигурация запуска; возможно, это не сработает, поэтому вам нужно отредактировать его (например, ** кнопку "Выполнить" (со значком "Play") на панели инструментов> "Запустить конфигурации"> выберите тот, который соответствует вашему классу. CTRL + click на это после нажатия на Play).

Затем добавьте это в Аргументы> VM аргументы:

--module-path ${project_classpath:REPLACE_ME_WITH_YOUR_PROJECT_NAME} --add-modules javafx.controls,javafx.fxml

Так что хитрость здесь заключалась в том, чтобы использовать ${project_classpath} переменная. Потому что в противном случае вам нужно было бы написать точно путь к банке javafx, которая находится где-то в вашем .m2 Сделки РЕПО. Это может затруднить повторное использование конфигурацией запуска коллегами.

2b) Запуск с использованием Eclipse БЕЗ указания -module-path

Это часть существования, которую я обнаружил по ошибке после примерно 5 часов Java 11 и модулей "веселья". Ваше приложение может работать из коробки, не касаясь -module-path, Разумеется, библиотеки javafx все еще должны быть в вашем classpath (но это обрабатывается mvn). Хитрость заключается в том, что ваше основное приложение НЕ ДОЛЖНО расширяться Application (например MyApplication ниже). Если это ваш случай, то создайте новый класс с main() функция, которая делает, например:

Application.launch(MyApplication.class);

НОТА

В моем случае (то есть в Windows с JDK 8 по умолчанию в системе) существует известная проблема с запуском javafx. Решение состоит в том, чтобы добавить следующий аргумент VM: -Djava.library.path=C:, Так что на самом деле для всех 4 методов, описанных выше, мне нужно было добавить это.

У меня были проблемы с FXMLLoader... не смог найти класс.

Я решил это, изменив приведенные выше аргументы, чтобы загрузить все модули, а не только javafx.controls:

--module-path <path to the javafx sdk> --add-modules=ALL-MODULE-PATH

Как упоминалось @Cristian, создание отдельного класса Main, похоже, помогает без каких-либо других аргументов.

public class Main {
    public static void main(String[] args) {
        Application.launch(MainWindow.class);
    }
}

public class MainWindow extends Application {
    @Override
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(new StackPane(l), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    // do not use this method
    //  public static void main(String[] args) {
    //      Application.launch(MainWindow.class);
    //  }
}

@ Хосе Переда совершенно прав, все работает как надо. Я проверил это с выпуском Eclipse 2018-12. Итак, после загрузки среды IDE ( https://www.eclipse.org/downloads/packages/release/2018-12/r/eclipse-ide-java-developers) и установки плагина e(fx)clipse вам необходимо быть в состоянии создать элемент "JavaFx Project" в вашей рабочей области.

Следующим шагом является удаление "JavaFX SDK" из модуля "Classpath" (Свойства -> Путь сборки Java -> Библиотеки) и добавление зависимости Maven для удаления ошибок компиляции:

<dependency>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-controls</artifactId>
   <version>11.0.1</version>
</dependency>

JavaFX SDK для удаления

Последний шаг - добавить аргумент VM в "Run Configuration" вашего класса JavaFX для запуска приложения (Run Configurations -> вкладка Arguments -> VM arguments):

--module-path C:\path to the OpenJFX\javafx-sdk-11.0.1\lib --add-modules=javafx.controls

и это должно работать после того, как вы запустите его. Конечно, вы должны загрузить JavaFX SDK до этого ( https://gluonhq.com/products/javafx/), разархивировать его и использовать путь к папке "lib" в вышеупомянутом аргументе VM.

Используя совет Carlao2005, я смог составить полное руководство по тому, как заставить JavaFX работать в Eclipse теперь, когда JavaFX не поставляется с Java SDK. Предполагается, что у вас есть Eclipse с установленным плагином E(FX)clipse и установленным JavaFX SDK. Обратите внимание: важно, чтобы JavaFX SDK был установлен в месте без пробелов в пути, поэтому C:/Program Files не является хорошим выбором.

Выполняйте этот шаг для создания каждого нового проекта Java FX. Сначала перейдите в файл> новый> другой и найдите вариант для создания нового проекта Java FX. После создания проекта вы заметите, что он не компилируется, поскольку Eclipse необходимо знать о библиотеках JavaFX. Откройте свойства проекта и найдите путь сборки Java. Выберите вкладку "Библиотеки", а затем - путь к модулю. Затем нажмите кнопку " Добавить библиотеку", а затем выберите опцию " Пользовательская библиотека", прежде чем нажимать " Далее".

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

Если вы попытаетесь запустить проект, вы обнаружите, что он не сможет найти application.main. Чтобы исправить это, у нас есть последний шаг. Щелкните правой кнопкой мыши main.java в проводнике пакетов Eclipse. Выберите " Запуск от имени"> " Выполнитьконфигурации", а затем выберите вкладку "Аргументы". В аргументы vm добавьте следующее (где путь к модулю указывает на вашу установку Java FX sdk):

--module-path C:\Programs\Java\javafx-sdk-13.0.1\lib --add-modules=ALL-MODULE-PATH

Вот и все, теперь вы можете запустить проект Java FX и увидеть окно по умолчанию. Если вы работаете в Mac OS, снимите флажок аргумента -XstartOnFirstThread при запуске SWT, если у вас возникли проблемы с отображением окна.

Другие вопросы по тегам