我开始深入研究大型应用程序(包括 Java FX 部分)的 Java 11 迁移,我需要您的帮助来了解命令行上的 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();
}
}
和一个简单的 pom
<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:空
jdk.module.upgrade.path:空
jdk.module.main:空
jdk.module.main.class:空
从 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:空
jdk.module.main:空
jdk.module.main.class:空
jdk.module.main.class:空
我不能让它在 Eclipse 中工作,因为它是从命令行工作的:我被迫弄乱了模块和模块路径。如果我不添加 vm 参数,我会得到“错误:JavaFX 运行时组件丢失,并且需要运行此应用程序”或“启动层 java.lang.module.FindException 初始化期间发生错误:模块 javafx.controls未找到”。
它如何在没有更多配置的情况下从命令行工作?据我所知,Maven不会自动向模块路径添加任何东西......
任何想法 ?我错过了什么?
更新 1:我意识到当在 Eclipse 中“作为 Maven 项目”导入项目时(我总是这样做),它会导致 JRE 被添加到模块路径中(这不是我的 classis 项目的情况)。看截图