如何在IDE之外启动JavaFX 11应用程序?

3

我下载了:
- OpenJDK 11.0.2
- JavaFX SDK 11.0.2
两个文件都被提取到路径C:/Program Files/Java/

操作系统:Windows 10
IDE: NetBeans 10.0

路径:

JAVA_HOME = C:/Program Files/Java/jdk-11.0.2  
PATH_TO_FX = C:/Program Files/Java/javafx-sdk-11.0.2/lib

在环境变量的Inside Path中添加%JAVA_HOME%/bin

在NetBeans中,我创建了一个名为JFXDev的Java应用程序项目,其中包含一个com包。在com包内有一个主类,其代码如下:

package com;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

        @Override
        public void start(Stage primaryStage) {
            Button btn = new Button();
            btn.setText("Say 'Hello World'");
            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hello World!");
                }
            });

            StackPane root = new StackPane();
            root.getChildren().add(btn);

            Scene scene = new Scene(root, 300, 250);

            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
        }

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

}


项目属性已被修改: 1)库 -> 模块路径新增路径 C:/Program Files/Java/javafx-sdk-11.0.2/lib 2)库 -> 类路径新增路径 C:/Program Files/Java/javafx-sdk-11.0.2/lib/javafx.controls.jar 3)运行 -> VM选项:新增 --add-modules=javafx.controls,javafx.fxml
当我使用NetBeans启动应用程序时,它可以完美地工作,但我无法从dist文件夹中启动应用程序。我在cmd中尝试了以下命令: 1) 命令:java -jar JFXDev.jar
  • 响应:Error: could not find or load main class com.Main
2) 命令:java --module-path '%PATH_TO_FX% --add-modules=javafx.comntrols JFXDev
  • 响应:Error: Could not find or load main class Files/Java/javafx-sdk-11.0.2/lib
3) 命令:java --module-path %PATH_TO_FX% --add-modules=javafx.comntrols Main
  • 响应:Error: Could not find or load main class Files/Java/javafx-sdk-11.0.2/lib
4) 命令:java --module-path %PATH_TO_FX% --add-modules=javafx.comntrols com.Main
  • 响应:Error: Could not find or load main class Files/Java/javafx-sdk-11.0.2/lib
5) 命令:java --module-path "C:/Program Files/Java/javafx-sdk-11.0.2/lib/" --add-modules=javafx.comntrols com.Main
  • 响应:Error: Could not find or load main class Main
后来,我添加了module-info.java文件:
module JFXDev {  
    requires javafx.controls;  
    exports com;  
}  

但这没有任何区别。
我做错了什么,有什么建议或建议吗?

我尝试了https://openjfx.io/openjfx-docs/#install-javafx的步骤,但是我还是得到相同的错误:/


如果您使用"%PATH_TO_FX%"(包含引号)会怎样?错误消息表明您的参数中存在空格问题。 - Slaw
@Slaw 无论哪种方式都不起作用。 - John
同样的错误还是新的错误? - Slaw
@Slaw 同样的错误,找不到主类。我在我的问题中更新了新的第5点,尝试使用完整路径,但收到了相同的响应。 - John
如果您有一个包含Main-Class条目的JAR文件,请尝试使用java -p“%PATH_TO_FX%”--add-modules javafx.controls -jar <path-to-jar-file>命令。 (注意:-p--module-path的简写) - Slaw
显示剩余2条评论
1个回答

2

实际回答

你提供的一些错误提示表明你的参数中存在空格问题(例如:C:/Program Files/...)。请在%PATH_TO_FX%周围加上引号:"%PATH_TO_FX%"。然后,如你在评论中所说,你需要使用以下正确的命令行:

java -p "%PATH_TO_FX%" --add-modules javafx.controls -jar <path-to-jar-file> 

其余的回答

根据您提供的信息,很难(至少对我来说是)确定问题的具体原因。相反,我将提供一些示例,展示如何在命令行中启动JavaFX应用程序,包括模块化和非模块化。

假设您有一个项目,其中一个类 - 主类 - 命名为com.example.Main。该类扩展了Application并显示了一个简单的窗口。我们还假设,在代码是模块化的情况下,该模块看起来像:


Original Answer翻译成:最初的回答。

module app {
    requires javafx.controls;
    exports com.example to javafx.graphics;
}

最初的回答:
你的项目结构看起来像这样:
翻译内容:
您的项目结构应该是这样的:
\---<project-directory>
    +---out
    |   +---artifacts
    |   |       app-1.0.jar (modular or non-modular)
    |   |
    |   \---classes
    |       |   module-info.class (when modular)
    |       |
    |       \---com
    |           \---example
    |                   Main.class
    |
    \---src
        |   module-info.java (when modular)
        |
        \---com
            \---example
                    Main.java

然后你的命令行将会像以下其中一个(面向Windows):

非模块化

解压目录

最初的回答

java -p "%PATH_TO_FX%" --add-modules javafx.controls -cp out\classes com.example.Main

Jar File

java -p "%PATH_TO_FX%" --add-modules javafx.controls -jar out\artifacts\app-1.0.jar

注意:需要在清单文件中添加Main-Class属性。

模块化

目录分解

java -p "%PATH_TO_FX%;out\classes" -m app/com.example.Main

Jar File

java -p "%PATH_TO_FX%;out\artifacts" -m app/com.example.Main

如果使用--main-class参数创建/更新了Jar包,则该Jar包的主类为"最初的回答"。
java -p "%PATH_TO_FX%;out\artifacts" -m app

注:

  • 以上假设<project-directory>是工作目录。
  • -p--module-path的简写
  • -m--module的简写
  • -cp--class-path-classpath的简写
"Original Answer"翻译成"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接