如何在 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 所需的步骤。

  1. here 安装 Eclipse 2018-09。

  2. here 安装 JDK 11。

  3. 将 Java 11 作为已安装的 JRE 添加到 Eclipse:Eclipse -> Window -> 首选项 -> Java -> 已安装的 JRE -> 添加。

  4. here 下载 JavaFX 11 ea。

  5. 创建用户库:Eclipse -> Window -> 首选项 -> Java -> 构建路径 -> 用户库 -> 新建。将其命名为 JavaFX11 并在 JavaFX 11-ea.

    的 lib 文件夹下包含 jars
  6. 创建一个 Java 项目。您不需要添加模块路径 class。确保 select Java 11 并将 JavaFX11 库添加到项目的模块路径中。

  7. 添加包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,因为我们已经包含了用户库。

  1. 添加运行时间参数。编辑项目的 运行 配置,并添加这些 VM 参数:

    --模块路径 C:\Users<用户>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls

  2. 最后,运行项目。它应该可以正常工作。

@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);
    //  }
}