如何在 IDE 之外启动 JavaFX 11 应用程序?
How to start JavaFX 11 application outside IDE?
我下载了:
- OpenJDK 11.0.2
- JavaFX SDK 11.0.2
两个文件都被提取到路径 C:/Program Files/Java/
OS: 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
内部路径系统变量添加%JAVA_HOME%/bin
我在 NetBeans 中创建了 Java 名为 JFXDev 的应用程序项目,其中包含一个包 com. com 包内是一个主要的 class,代码如下:
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) 运行 -> 虚拟机选项:添加了 --add-modules=javafx.controls,javafx.fxml
当我使用 NetBeans 启动应用程序时,它运行良好,但我无法从 dist 文件夹启动应用程序。我在 cmd 中尝试了以下命令:
命令:java -jar JFXDev.jar
- 响应:
Error: could not find or load main class com.Main
命令: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
命令: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
命令: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
- 命令:
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 中的步骤,但我得到了同样的错误:/
"Actual" 回答
您提供的部分错误表明您的参数中存在空格问题(例如 C:/Program Files/...
)。用引号将 %PATH_TO_FX%
括起来:"%PATH_TO_FX%"
。然后,正如您在 中所说,适合您的正确命令行是:
java -p "%PATH_TO_FX%" --add-modules javafx.controls -jar <path-to-jar-file>
其余答案
根据您提供的信息,很难(至少对我而言)说出问题到底是什么。相反,我将给出一些从命令行启动 JavaFX 应用程序的示例,包括模块化和非模块化的。
假设您有一个项目,其中有一个 class——主要的 class——名为 com.example.Main
。 class 扩展了 Application
并显示了一个简单的 window。我们还可以说,当代码是模块化的时,模块看起来像:
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
属性。
模块化
展开目录
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 是 created/updated 和 --main-class
java -p "%PATH_TO_FX%;out\artifacts" -m app
备注:
- 以上假设
<project-directory>
为工作目录
-p
是 shorthand 对于 --module-path
-m
是 shorthand 对于 --module
-cp
对于 --class-path
或 -classpath
是 shorthand
我下载了:
- OpenJDK 11.0.2
- JavaFX SDK 11.0.2
两个文件都被提取到路径 C:/Program Files/Java/
OS: 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
内部路径系统变量添加%JAVA_HOME%/bin
我在 NetBeans 中创建了 Java 名为 JFXDev 的应用程序项目,其中包含一个包 com. com 包内是一个主要的 class,代码如下:
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) 运行 -> 虚拟机选项:添加了 --add-modules=javafx.controls,javafx.fxml
当我使用 NetBeans 启动应用程序时,它运行良好,但我无法从 dist 文件夹启动应用程序。我在 cmd 中尝试了以下命令:
命令:
java -jar JFXDev.jar
- 响应:
Error: could not find or load main class com.Main
- 响应:
命令:
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
- 响应:
命令:
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
- 响应:
命令:
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
- 响应:
- 命令:
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 中的步骤,但我得到了同样的错误:/
"Actual" 回答
您提供的部分错误表明您的参数中存在空格问题(例如 C:/Program Files/...
)。用引号将 %PATH_TO_FX%
括起来:"%PATH_TO_FX%"
。然后,正如您在
java -p "%PATH_TO_FX%" --add-modules javafx.controls -jar <path-to-jar-file>
其余答案
根据您提供的信息,很难(至少对我而言)说出问题到底是什么。相反,我将给出一些从命令行启动 JavaFX 应用程序的示例,包括模块化和非模块化的。
假设您有一个项目,其中有一个 class——主要的 class——名为 com.example.Main
。 class 扩展了 Application
并显示了一个简单的 window。我们还可以说,当代码是模块化的时,模块看起来像:
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
属性。
模块化
展开目录
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 是 created/updated 和 --main-class
java -p "%PATH_TO_FX%;out\artifacts" -m app
备注:
- 以上假设
<project-directory>
为工作目录 -p
是 shorthand 对于--module-path
-m
是 shorthand 对于--module
-cp
对于--class-path
或-classpath
是 shorthand