(для справки, в eclipse я импортирую проект как проект Maven, поэтому m2e должен создать путь к классу точно так же, как Maven в командной строке, но кажется, что JRE добавлен как путь к модулю - см. скриншот, который я добавлю в мой оригинальный пост) (опять же, извините за то, что так настаивал, но мне нужно понять весь механизм в деталях, чтобы объяснить его команде;)
инаю копаться в миграции Java 11 для большого приложения (включая части Java FX), и мне нужна ваша помощь, чтобы понять разницу между Maven (3.5.4) в командной строке и Eclipse (2018-09 с обновлением Java11) ).
У меня есть простой класс Java 11
import java.util.stream.Stream;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
public class HelloFX 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(l, 640, 480);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Stream.of("jdk.module.path",
"jdk.module.upgrade.path",
"jdk.module.main",
"jdk.module.main.class").forEach(key -> System.out.println(key + " : " + System.getProperty(key)));
Application.launch();
}
}
и простой пом
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gluonhq</groupId>
<artifactId>hellofx</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>HelloFX</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
Когда я запускаю 'mvn compile exec: java', я думаю, что ничто не использует новый путь к модулю, и программа отображает панель JavaFX, как и ожидалось. Система состоит из:
jdk.module.path: null
jdk.module.upgrade.path: null
jdk.module.main: null
jdk.module.main.class: null
При запуске из модуля запуска Eclipse я должен добавить в модуль запуска следующие аргументы vm:
--module-path = $ {env_var: JAVAFX_PATH} --add-modules = javafx.controls
и панель также отображается, но вывод:
jdk.module.path: C: \ dev \ tools \ javafx-sdk-11 \ lib
jdk.module.upgrade.path: null
jdk.module.main: null
jdk.module.main.class: null
jdk.module.main.class: null
Я не могу заставить его работать в Eclipse, поскольку он работает из командной строки: я вынужден связываться с модулями и путь к модулю. Если я не добавляю параметры vm, я получаю либо «Ошибка: отсутствуют компоненты среды выполнения JavaFX, которые необходимы для запуска этого приложения», либо «Ошибка произошла во время инициализации загрузочного слоя java.lang.module.FindException: Модуль javafx.controls не найдено".
Как это может работать из командной строки без дополнительной настройки? Насколько мне известно, Maven не добавляет ничего автоматически к пути модуля ...
Любая идея ? Что мне не хватает?
Обновление 1: я понял, что при импорте проекта в Eclipse «как проект Maven» (что я всегда делаю) это приводит к добавлению JRE в путь к модулю (что не относится к моим проектам classis). Смотрите скриншот