如何从命令行启动 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.
自 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.