如何从命令行启动 JavaFX 源代码文件?

How to launch JavaFX source code file from command line?

自 JDK 11 起,java 命令可以启动 java 源代码文件,即无需先编译您的 java 源代码。这是我的 java 源代码:

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

public class HelloJavaFxWorld extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Label label = new Label("Hello JavaFX World");
        Pane root = new Pane(label);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

我将此代码保存为文件 HelloJavaFxWorld.java
我打开命令提示符 window 并输入以下命令。

java HelloJavaFxWorld.java

这是(部分)输出。

HelloJavaFxWorld.java:1: error: package javafx.application does not exist
import javafx.application.Application;

如何运行 JavaFX 源代码文件?

由于JDK 11 是modular,您需要添加JavaFX 模块。请尝试以下操作。

java -p "path\to\javafx.graphics.jar;path\to\javafx.base.jar;path\to\javafx.controls.jar" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

path\to 替换为 JAR 文件的实际路径。例如,在我的 Windows 10 机器上,我安装了 JDK 16.0.1,所以我使用的是 JavaFX 16 并将 [JavaFX] JAR 文件放在这个文件夹中:

C:\Program Files\Java\javafx-sdk-16\lib

所以我启动 JavaFX 源代码文件的实际命令是:

java -p "C:\Program Files\Java\javafx-sdk-16\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-16\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-16\lib\javafx.controls.jar" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

请注意,您可以使用 --module-path 而不是 -p。那么命令就变成了:

java --module-path "C:\Program Files\Java\javafx-sdk-16\lib" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

请注意,我从包含 java 源代码文件的文件夹中输入该命令。

以上命令可能会导致以下异常。

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: HelloJavaFxWorld
        at javafx.graphics/javafx.application.Application.launch(Application.java:310)
        at HelloJavaFxWorld.main(HelloJavaFxWorld.java:19)
Caused by: java.lang.ClassNotFoundException: HelloJavaFxWorld
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:466)
        at javafx.graphics/javafx.application.Application.launch(Application.java:298)
        at HelloJavaFxWorld.main(HelloJavaFxWorld.java:19)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)

这是因为,在启动java源代码文件时,会编译源代码,并将编译后的class存储在内存中,即no .class 文件已创建。方法 launch(String...),在 class javafx.application.Application 中,调用方法 forName,在 class java.lang.Class 中,以便加载 JavaFX 应用程序 class .由于没有 HelloJavaFxWorld.class 文件,方法 forName 抛出 ClassNotFoundException.

为了解决这个问题,只需更改您的 java 源代码以调用另一个 launch 方法。换句话说,将方法 main 更改为以下内容。

public static void main(String[] args) {
    launch(HelloJavaFxWorld.class, args);
}

现在,当我输入上面的 java 命令时,我得到以下 window.