如何在 Java 11 中向 Eclipse 添加 JavaFX 运行时?
How to add JavaFX runtime to Eclipse in Java 11?
我收到以下错误,因为 Java 11 将 JavaFX 作为最新版本的一部分排除在外。
Error: JavaFX runtime components are missing, and are required to run
this application
那么如何在 Java 11 中将 JavaFX 添加到 Eclipse?
谢谢
在 getting started guide 之后,这些是从 Eclipse 运行 JavaFX 11 所需的步骤。
从 here 安装 Eclipse 2018-09。
从 here 安装 JDK 11。
将 Java 11 作为已安装的 JRE 添加到 Eclipse:Eclipse -> Window -> 首选项 -> Java -> 已安装的 JRE -> 添加。
从 here 下载 JavaFX 11 ea。
创建用户库:Eclipse -> Window -> 首选项 -> Java -> 构建路径 -> 用户库 -> 新建。将其命名为 JavaFX11 并在 JavaFX 11-ea.
的 lib 文件夹下包含 jars
创建一个 Java 项目。您不需要添加模块路径 class。确保 select Java 11 并将 JavaFX11 库添加到项目的模块路径中。
添加包javafx11
和主应用classHelloFX
:
package javafx11;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String version = System.getProperty("java.version");
Label l = new Label ("Hello, JavaFX 11, running on "+version);
Scene scene = new Scene (new StackPane(l), 300, 200);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
请注意,编辑器不应该抱怨 JavaFX classes,因为我们已经包含了用户库。
添加运行时间参数。编辑项目的 运行 配置,并添加这些 VM 参数:
--模块路径 C:\Users<用户>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls
最后,运行项目。它应该可以正常工作。
@José Pereda 完全正确,一切正常。我已经使用 Eclipse 版本 2018-12 对其进行了测试。因此,在您下载 IDE (https://www.eclipse.org/downloads/packages/release/2018-12/r/eclipse-ide-java-developers) 并安装 e(fx)clipse 插件后,您应该能够在您的工作区中创建一个 "JavaFx Project" 项目。
下一步是从 "Classpath" 模块中删除 "JavaFX SDK"(属性 -> Java 构建路径 -> 库)并添加 Maven 依赖项以删除编译错误:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.1</version>
</dependency>
最后一步是将 VM 参数添加到 JavaFX class 的 "Run Configuration" 以启动应用程序(运行 配置 -> 参数选项卡 ->虚拟机参数):
--module-path C:\path to the OpenJFX\javafx-sdk-11.0.1\lib --add-modules=javafx.controls
它应该在你 运行 之后工作。当然,你应该先下载JavaFX SDK(https://gluonhq.com/products/javafx/),解压并使用上述VM参数中"lib"文件夹的路径。
我想分享我关于启动 javafx 11 应用程序的发现。我说的是一个现有的遗留 javafx 应用程序,最初是在没有模块的情况下开发的(例如 w/ Java 8)。
IMO 最有趣的方法是下面的 方法 #2b,它需要最少的更改,即它不需要 -module-path
参数 。我提到我正在使用 maven,所以请参见。以前的答案第一步是在 pom.xml
中添加对 javafx 的依赖。例如:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
为了启动,我找到了几个选项:
1a) 从命令行使用 maven 启动
在您的 pom.xml
中配置如下部分:
<build>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>org.openjfx.hellofx.MainApp</mainClass>
</configuration>
</plugin>
</plugins>
</build>
在此之后,您可以从控制台 window 运行 mvn exec:java
,这应该会启动应用程序。 Maven 将负责将所有条目从 classpath 添加到 module path。我想起了 Eclipse 中的 CTRL + ALT + T
快捷方式,它直接在 IDE.
中打开一个终端 window
1b) 使用 maven 启动,但作为 Eclipse 启动配置
右键单击项目 > 运行 As > Maven Build...。然后在 Goals 文本框中输入 exec:java
。 优点 优于前一种方法:与 Eclipse 的集成度更高。并且调试方便。您只需要在调试模式下重新启动启动配置即可。我可以提醒一下,Eclipse 启动配置可以作为 .launch
文件直接存储在项目目录(repo)中,因此同事 shareable/reusable。在 编辑配置 window.
中使用最后一个选项卡 Common
2a) 使用 Eclipse 启动并使用变量
指定 -module-path
右键点击主class > 运行 As > Java Application。第一次点击会创建一个新的启动配置;可能它不会工作,所以你需要编辑它(例如工具栏中的 **运行 按钮(带播放图标) > 运行 配置 > select 对应于你的那个class。或者点击播放后CTRL + click
就可以了。
然后在 Arguments > VM arguments:
中添加
--module-path ${project_classpath:REPLACE_ME_WITH_YOUR_PROJECT_NAME} --add-modules javafx.controls,javafx.fxml
所以这里的技巧是使用 ${project_classpath}
变量。因为否则你应该需要准确地写出通往 javafx jar 的路径,它位于你的 .m2
仓库中的某个地方。这样做会使启动配置不容易被同事重复使用。
2b) 使用 Eclipse 启动而不指定 -module-path
这是 la piece de résistence,我在 Java 11 & modules "fun" 大约 5 小时后无意中发现的。您的应用程序可以开箱即用,无需触及 -module-path
。 javafx 库当然仍然需要在您的 class 路径中(但这由 mvn 处理)。 技巧是(参见this)你的主应用程序不应该扩展Application
(例如下面的MyApplication
)。如果是这种情况,则使用 main()
函数创建一个新的 class,例如:
Application.launch(MyApplication.class);
注意
在我的例子中(即在 Windows 上,系统中有一个默认的 JDK 8),有一个关于启动 javafx 的已知问题。解决方案是添加以下 VM arg:-Djava.library.path=C:
。所以实际上对于上面描述的所有 4 种方法我都需要添加这个。
我遇到了关于 FXMLLoader
的问题...无法找到 class。
我通过更改上面显示的参数解决了这个问题,加载 所有 模块,而不仅仅是 javafx.controls
:
--module-path <path to the javafx sdk> --add-modules=ALL-MODULE-PATH
使用 Carlao2005 的建议,由于 JavaFX 未随 Java SDK 一起提供,因此我能够将 JavaFX 在 Eclipse 中运行的完整指南放在一起。这假设您已安装 E(FX)clipse 插件并安装了 JavaFX SDK。请注意,重要的是 JavaFX SDK 安装在路径中没有空格的位置,因此 C:/Program Files 不是一个好的选择。
为每个要构建的新 Java FX 项目执行此步骤。首先,转到 file > new > other 并找到创建新 Java FX Project 的选项。创建项目后,您会注意到它不会编译,因为 Eclipse 需要了解 JavaFX 库。
访问 项目属性 ,然后找到 Java 构建路径 。 Select 库选项卡 然后 模块路径 。然后 select 添加库 按钮,然后 select 用户库 选项,然后按 下一步 .
在出现的window上,selectnew并将库命名为JavaFX13. Select 添加外部 jar 然后找到 lib 文件夹 JavaFX 13 安装目录和 select 所有 .jar 文件夹然后应用并关闭或完成所有 windows.
如果您尝试 运行 项目,您会发现它将无法找到 application.main。为了解决这个问题,我们还有最后一步。在 Eclipse 的包资源管理器中右键单击 main.java。 Select 运行 as > 运行 配置 然后 select 参数选项卡。在 vm 参数中添加以下内容(其中模块路径指向您安装的 Java FX sdk):
--module-path C:\Programs\Java\javafx-sdk-13.0.1\lib --add-modules=ALL-MODULE-PATH
就是这样,您现在应该可以 运行 Java FX 项目并查看默认 window。
如果 运行ning on Mac OS de-select 启动 SWT 时选项 -XstartOnFirstThread 参数,如果您在显示 window 时遇到问题。
如@Cristian 所述,创建一个单独的 Main class 似乎可以解决问题,无需任何其他参数。
public class Main {
public static void main(String[] args) {
Application.launch(MainWindow.class);
}
}
public class MainWindow extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
Scene scene = new Scene(new StackPane(l), 640, 480);
stage.setScene(scene);
stage.show();
}
// do not use this method
// public static void main(String[] args) {
// Application.launch(MainWindow.class);
// }
}
我收到以下错误,因为 Java 11 将 JavaFX 作为最新版本的一部分排除在外。
Error: JavaFX runtime components are missing, and are required to run this application
那么如何在 Java 11 中将 JavaFX 添加到 Eclipse? 谢谢
在 getting started guide 之后,这些是从 Eclipse 运行 JavaFX 11 所需的步骤。
从 here 安装 Eclipse 2018-09。
从 here 安装 JDK 11。
将 Java 11 作为已安装的 JRE 添加到 Eclipse:Eclipse -> Window -> 首选项 -> Java -> 已安装的 JRE -> 添加。
从 here 下载 JavaFX 11 ea。
创建用户库:Eclipse -> Window -> 首选项 -> Java -> 构建路径 -> 用户库 -> 新建。将其命名为 JavaFX11 并在 JavaFX 11-ea.
的 lib 文件夹下包含 jars创建一个 Java 项目。您不需要添加模块路径 class。确保 select Java 11 并将 JavaFX11 库添加到项目的模块路径中。
添加包
javafx11
和主应用classHelloFX
:
package javafx11;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String version = System.getProperty("java.version");
Label l = new Label ("Hello, JavaFX 11, running on "+version);
Scene scene = new Scene (new StackPane(l), 300, 200);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
请注意,编辑器不应该抱怨 JavaFX classes,因为我们已经包含了用户库。
添加运行时间参数。编辑项目的 运行 配置,并添加这些 VM 参数:
--模块路径 C:\Users<用户>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls
最后,运行项目。它应该可以正常工作。
@José Pereda 完全正确,一切正常。我已经使用 Eclipse 版本 2018-12 对其进行了测试。因此,在您下载 IDE (https://www.eclipse.org/downloads/packages/release/2018-12/r/eclipse-ide-java-developers) 并安装 e(fx)clipse 插件后,您应该能够在您的工作区中创建一个 "JavaFx Project" 项目。
下一步是从 "Classpath" 模块中删除 "JavaFX SDK"(属性 -> Java 构建路径 -> 库)并添加 Maven 依赖项以删除编译错误:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.1</version>
</dependency>
最后一步是将 VM 参数添加到 JavaFX class 的 "Run Configuration" 以启动应用程序(运行 配置 -> 参数选项卡 ->虚拟机参数):
--module-path C:\path to the OpenJFX\javafx-sdk-11.0.1\lib --add-modules=javafx.controls
它应该在你 运行 之后工作。当然,你应该先下载JavaFX SDK(https://gluonhq.com/products/javafx/),解压并使用上述VM参数中"lib"文件夹的路径。
我想分享我关于启动 javafx 11 应用程序的发现。我说的是一个现有的遗留 javafx 应用程序,最初是在没有模块的情况下开发的(例如 w/ Java 8)。
IMO 最有趣的方法是下面的 方法 #2b,它需要最少的更改,即它不需要 -module-path
参数 。我提到我正在使用 maven,所以请参见。以前的答案第一步是在 pom.xml
中添加对 javafx 的依赖。例如:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
为了启动,我找到了几个选项:
1a) 从命令行使用 maven 启动
在您的 pom.xml
中配置如下部分:
<build>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>org.openjfx.hellofx.MainApp</mainClass>
</configuration>
</plugin>
</plugins>
</build>
在此之后,您可以从控制台 window 运行 mvn exec:java
,这应该会启动应用程序。 Maven 将负责将所有条目从 classpath 添加到 module path。我想起了 Eclipse 中的 CTRL + ALT + T
快捷方式,它直接在 IDE.
1b) 使用 maven 启动,但作为 Eclipse 启动配置
右键单击项目 > 运行 As > Maven Build...。然后在 Goals 文本框中输入 exec:java
。 优点 优于前一种方法:与 Eclipse 的集成度更高。并且调试方便。您只需要在调试模式下重新启动启动配置即可。我可以提醒一下,Eclipse 启动配置可以作为 .launch
文件直接存储在项目目录(repo)中,因此同事 shareable/reusable。在 编辑配置 window.
2a) 使用 Eclipse 启动并使用变量
指定-module-path
右键点击主class > 运行 As > Java Application。第一次点击会创建一个新的启动配置;可能它不会工作,所以你需要编辑它(例如工具栏中的 **运行 按钮(带播放图标) > 运行 配置 > select 对应于你的那个class。或者点击播放后CTRL + click
就可以了。
然后在 Arguments > VM arguments:
中添加--module-path ${project_classpath:REPLACE_ME_WITH_YOUR_PROJECT_NAME} --add-modules javafx.controls,javafx.fxml
所以这里的技巧是使用 ${project_classpath}
变量。因为否则你应该需要准确地写出通往 javafx jar 的路径,它位于你的 .m2
仓库中的某个地方。这样做会使启动配置不容易被同事重复使用。
2b) 使用 Eclipse 启动而不指定 -module-path
这是 la piece de résistence,我在 Java 11 & modules "fun" 大约 5 小时后无意中发现的。您的应用程序可以开箱即用,无需触及 -module-path
。 javafx 库当然仍然需要在您的 class 路径中(但这由 mvn 处理)。 技巧是(参见this)你的主应用程序不应该扩展Application
(例如下面的MyApplication
)。如果是这种情况,则使用 main()
函数创建一个新的 class,例如:
Application.launch(MyApplication.class);
注意
在我的例子中(即在 Windows 上,系统中有一个默认的 JDK 8),有一个关于启动 javafx 的已知问题。解决方案是添加以下 VM arg:-Djava.library.path=C:
。所以实际上对于上面描述的所有 4 种方法我都需要添加这个。
我遇到了关于 FXMLLoader
的问题...无法找到 class。
我通过更改上面显示的参数解决了这个问题,加载 所有 模块,而不仅仅是 javafx.controls
:
--module-path <path to the javafx sdk> --add-modules=ALL-MODULE-PATH
使用 Carlao2005 的建议,由于 JavaFX 未随 Java SDK 一起提供,因此我能够将 JavaFX 在 Eclipse 中运行的完整指南放在一起。这假设您已安装 E(FX)clipse 插件并安装了 JavaFX SDK。请注意,重要的是 JavaFX SDK 安装在路径中没有空格的位置,因此 C:/Program Files 不是一个好的选择。
为每个要构建的新 Java FX 项目执行此步骤。首先,转到 file > new > other 并找到创建新 Java FX Project 的选项。创建项目后,您会注意到它不会编译,因为 Eclipse 需要了解 JavaFX 库。 访问 项目属性 ,然后找到 Java 构建路径 。 Select 库选项卡 然后 模块路径 。然后 select 添加库 按钮,然后 select 用户库 选项,然后按 下一步 .
在出现的window上,selectnew并将库命名为JavaFX13. Select 添加外部 jar 然后找到 lib 文件夹 JavaFX 13 安装目录和 select 所有 .jar 文件夹然后应用并关闭或完成所有 windows.
如果您尝试 运行 项目,您会发现它将无法找到 application.main。为了解决这个问题,我们还有最后一步。在 Eclipse 的包资源管理器中右键单击 main.java。 Select 运行 as > 运行 配置 然后 select 参数选项卡。在 vm 参数中添加以下内容(其中模块路径指向您安装的 Java FX sdk):
--module-path C:\Programs\Java\javafx-sdk-13.0.1\lib --add-modules=ALL-MODULE-PATH
就是这样,您现在应该可以 运行 Java FX 项目并查看默认 window。 如果 运行ning on Mac OS de-select 启动 SWT 时选项 -XstartOnFirstThread 参数,如果您在显示 window 时遇到问题。
如@Cristian 所述,创建一个单独的 Main class 似乎可以解决问题,无需任何其他参数。
public class Main {
public static void main(String[] args) {
Application.launch(MainWindow.class);
}
}
public class MainWindow extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
Scene scene = new Scene(new StackPane(l), 640, 480);
stage.setScene(scene);
stage.show();
}
// do not use this method
// public static void main(String[] args) {
// Application.launch(MainWindow.class);
// }
}