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

标签 java javafx javafx-11 netbeans-10

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

操作系统:Windows 10
集成开发环境: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

在 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) Libraries -> Modulepath 添加路径 C:/Program Files/Java/javafx-sdk-11.0.2/lib
2) Libraries -> Classpath添加路径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

    • 响应:错误:无法找到或加载主类 com.Main
  2. 命令:java --module-path '%PATH_TO_FX% --add-modules=javafx.comntrols JFXDev

    • 响应:错误:无法找到或加载主类 Files/Java/javafx-sdk-11.0.2/lib
  3. 命令:java --module-path %PATH_TO_FX% --add-modules=javafx.comntrols Main

    • 响应:错误:无法找到或加载主类 Files/Java/javafx-sdk-11.0.2/lib
  4. 命令:java --module-path %PATH_TO_FX% --add-modules=javafx.comntrols com.Main

    • 响应:错误:无法找到或加载主类 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
    • 响应:错误:无法找到或加载主类 Main

后来我添加了module-info.java文件:

module JFXDev {  
    requires javafx.controls;  
    exports com;  
}  

但这并没有什么区别。
我做错了什么,有什么意见或建议吗?

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

最佳答案

“实际”答案

您提供的某些错误表明您的参数中存在空格问题(例如 C:/Program Files/... )。环绕%PATH_TO_FX%带引号:"%PATH_TO_FX%" .然后,正如你在 a comment 中所说的那样,适合您的正确命令行是:

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

剩下的答案

根据您提供的信息,很难(至少对我而言)说出问题到底是什么。相反,我将提供一些从命令行启动 JavaFX 应用程序的示例,包括模块化和非模块化的。

假设您有一个包含一个类(主类)的项目,名为 com.example.Main .此类扩展 Application并显示一个简单的窗口。我们还可以这样说,当代码是模块化的时,模块看起来像:

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文件

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

注意:需要 Main-Class list 中的属性。

模块化

分解目录

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

Jar文件

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

或者如果 Jar 是使用 --main-class 创建/更新的

java -p "%PATH_TO_FX%;out\artifacts" -m app

注释:

  • 以上假定 <project-directory>是工作目录。
  • -p--module-path 的简写
  • -m--module 的简写
  • -cp--class-path 的简写或 -classpath

关于java - 如何在 IDE 之外启动 JavaFX 11 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55652036/

相关文章:

java - 在Java中覆盖文本文件的一部分

java - 如何初始化自定义 javafx Controller 的成员变量?

java - 如何获取场景上的元素JavaFX/动态添加对象到场景

gradle - JavaFX 11 : Create a jar file with Gradle

java - 是否可以使用 Java 注释来更改方法可见性?

java - 使用自定义字段中的特定条件断言预期异常

java - 使用 JMockit 模拟 ResourceLoading

mysql - 如何在javafx中获取表列每个单元格的值并将其存储在变量中

java - 如何使用JRE部署JavaFX 11 Desktop应用程序

java - 如何使用JRE部署JavaFX 11 Desktop应用程序