首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从命令行启动JavaFX源代码文件?

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

Stack Overflow用户
提问于 2021-05-08 09:53:57
回答 1查看 443关注 0票数 1

由于JDK 11,java命令可以启动一个java源代码文件,即不需要首先编译java源代码。以下是我的java源代码:

代码语言:javascript
复制
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

我打开命令提示符窗口并输入以下命令。

代码语言:javascript
复制
java HelloJavaFxWorld.java

这是输出的一部分。

代码语言:javascript
复制
HelloJavaFxWorld.java:1: error: package javafx.application does not exist
import javafx.application.Application;

如何运行JavaFX源代码文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-08 09:53:57

因为JDK 11是模组,所以需要添加JavaFX模块。试试看以下几点。

代码语言:javascript
复制
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

用JAR文件的实际路径替换path\to。例如,在我的Windows10机器上,我安装了JDK16.0.1,所以我使用JavaFX 16,并将JavaFX JAR文件放置在这个文件夹中:

代码语言:javascript
复制
C:\Program Files\Java\javafx-sdk-16\lib

因此,启动JavaFX源代码文件的实际命令是:

代码语言:javascript
复制
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

请注意,您可以使用-p而不是--module-path。然后,命令变成:

代码语言:javascript
复制
java --module-path "C:\Program Files\Java\javafx-sdk-16\lib" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

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

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

代码语言:javascript
复制
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文件。方法launch(String...),在类javafx.application.Application中,在类java.lang.Class中调用方法forName,以加载JavaFX应用程序类。因为没有HelloJavaFxWorld.class文件,所以forName方法会抛出ClassNotFoundException

为了解决这个问题,只需将java源代码更改为调用其他启动方法即可。换句话说,将方法main更改为以下内容。

代码语言:javascript
复制
public static void main(String[] args) {
    launch(HelloJavaFxWorld.class, args);
}

现在,当我输入上面的java命令时,我得到了以下窗口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67446229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档