如何在 Java 11 中将 JavaFX 运行时添加到 Eclipse?

Posted

技术标签:

【中文标题】如何在 Java 11 中将 JavaFX 运行时添加到 Eclipse?【英文标题】:How to add JavaFX runtime to Eclipse in Java 11? 【发布时间】:2019-02-08 05:25:56 【问题描述】:

我收到以下错误,因为 Java 11 将 JavaFX 排除在最新版本中。

Error: JavaFX runtime components are missing, and are required to run
this application

那么如何在 Java 11 中将 JavaFX 添加到 Eclipse 中? 谢谢。

【问题讨论】:

你关注getting started guide了吗?您能够成功执行哪些步骤?然后它在哪里失败了? 有类似建议的similar question for intelliJ。 无法从 Eclipse 运行 你的 Eclipse 版本是什么?我让它与 4.9M3 一起工作 日食光子(4.8.0)。你能运行 fx 应用程序吗? 【参考方案1】:

按照getting started guide,这些是从 Eclipse 运行 JavaFX 11 所需的步骤。

    从here 安装 Eclipse 2018-09。

    从here 安装 JDK 11。

    将 Java 11 作为已安装的 JRE 添加到 Eclipse:Eclipse -> Window -> Preferences -> Java -> Installed JREs -> Add.

    从here 下载 JavaFX 11 ea。

    创建用户库:Eclipse -> 窗口 -> 首选项 -> Java -> 构建路径 -> 用户库 -> 新建。将其命名为 JavaFX11,并在 JavaFX 11-ea 的 lib 文件夹下包含这些 jar。

    创建一个 Java 项目。您不需要添加模块路径类。确保选择 Java 11 并将 JavaFX11 库添加到项目的模块路径中。

    添加包javafx11和主应用类HelloFX

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

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

    --module-path C:\Users\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls

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

【讨论】:

完成。我还有一个疑问,我们如何避免在 VM 参数中提供模块路径,有什么方法可以从存储库中读取模块? 为此,您可以使用 Maven 或 Gradle,其中 JavaFX 依赖项通过本地存储库自动管理。有关 Maven 设置,请参阅上述指南。 您能解释一下“从这里安装 JDK 11”吗?该链接指向一个 .zip 文件。你的意思是把它解压缩,然后把它放在可以用于第 3 步的地方吗? 您可以安装 Oracle JDK 11,也可以从该链接安装 Open JDK 11,无需安装程序,因此只需将其解压缩到您喜欢的位置即可。 @AndrewS 请参阅openjfx.io/openjfx-docs/#IDE-Eclipse,一旦您下载了 JavaFX SDK,就会有一个 lib 文件夹,其中包含每个模块的 jar:javafx.base.jar,...【参考方案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 项目”项目。

下一步是从“类路径”模块(属性 -> Java 构建路径 -> 库)中删除“JavaFX SDK”并添加 Maven 依赖项以消除编译错误:

<dependency>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-controls</artifactId>
   <version>11.0.1</version>
</dependency>

最后一步是在 JavaFX 类的“运行配置”中添加一个 VM 参数以启动应用程序(运行配置 -> 参数选项卡 -> VM 参数):

--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”文件夹的路径。

【讨论】:

当依赖管理应该是 Maven 的工作时,为什么还要手动下载整个 Java Fx SDK?【参考方案3】:

我想分享我关于启动 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>

之后,您可以从控制台窗口运行mvn exec:java,这应该会启动应用程序。 Maven 将负责将 classpath 中的所有条目添加到 module path。我提醒一下 Eclipse 中的 CTRL + ALT + T 快捷方式,它直接在 IDE 中打开一个终端窗口。

1b) 使用 maven 启动,但作为 Eclipse 启动配置

右键单击项目 > Run As > Maven Build...。然后在 Goals 文本框中输入 exec:java优势 优于前一种方法:与 Eclipse 的集成度更高。并且易于调试。您只需要在调试模式下重新启动启动配置即可。我可以提醒一下,Eclipse 启动配置可以直接作为.launch 文件存储在项目目录(repo)中,因此可供同事共享/重用。使用编辑配置窗口中的最后一个标签Common

2a) 使用 Eclipse 启动并使用变量指定 -module-path

右键单击主类 > 运行方式 > Java 应用程序。第一次单击时会创建一个新的启动配置;可能它不起作用,因此您需要对其进行编辑(例如,工具栏中的**运行按钮(带播放图标)>运行配置>选择与您的班级相对应的那个。或者点击CTRL + click就可以了em>播放)。

然后将其添加到 Arguments > VM arguments

--module-path $project_classpath:REPLACE_ME_WITH_YOUR_PROJECT_NAME --add-modules javafx.controls,javafx.fxml

所以这里的技巧是使用$project_classpath 变量。因为否则您应该需要准确地编写指向 javafx jar 的路径,该路径位于您的 .m2 repo 中的某个位置。这样做会使启动配置不容易被同事重用。

2b) 使用 Eclipse 启动而不指定 -module-path

这是 la piece de résistence,我在使用 Java 11 和模块“有趣”大约 5 小时后错误地发现了它。您的应用程序可以开箱即用,无需接触-module-path。 javafx 库当然仍然需要在您的类路径中(但这由 mvn 处理)。 技巧是(参见this)你的主应用程序不应该扩展Application(例如下面的MyApplication)。如果这是您的情况,请使用 main() 函数创建一个新类,例如:

Application.launch(MyApplication.class);

注意

在我的情况下(即在 Windows 上,系统中有默认的 JDK 8),有一个关于启动 javafx 的已知问题。解决方案是添加以下 VM arg:-Djava.library.path=C:。所以实际上对于上面描述的所有 4 种方法,我都需要添加这个。

【讨论】:

Application.launch(MyApplication.class);走?我认为您需要举一个整个文件的示例。 2b) 是一个非常好的观察结果,它为我节省了很多时间 - 谢谢!【参考方案4】:

我遇到了关于 FXMLLoader 的问题...它无法找到课程。

我通过更改上面显示的参数解决了这个问题,加载所有模块,而不仅仅是javafx.controls

--module-path <path to the javafx sdk> --add-modules=ALL-MODULE-PATH

【讨论】:

也许这篇文章的好人可以看看这个:***.com/questions/55689045/…Best 问候!【参考方案5】:

使用 Carlao2005 的建议,我能够整理出一份完整的指南,让 JavaFX 在 Eclipse 中工作,因为 JavaFX 没有随 Java SDK 一起提供。这假设您安装了带有 E(FX)clipse 插件的 Eclipse 并安装了 JavaFX SDK。请注意,JavaFX SDK 安装在路径中没有空格的位置很重要,因此 C:/Program Files 不是一个好的选择。

为每个要构建的新 Java FX 项目执行此步骤。首先,转到 file > new > other 并找到用于创建新 Java FX Project 的选项。创建项目后,您会注意到它不会编译,因为 Eclipse 需要了解 JavaFX 库。 访问 项目属性,然后找到 Java 构建路径。选择库选项卡,然后选择模块路径。然后选择添加库按钮,然后选择用户库选项,然后按下一步

在出现的窗口中,选择 new 并将库命名为 JavaFX13。选择 add external jars 然后找到 JavaFX 13 安装目录的 lib 文件夹并选择所有 .jar 文件夹然后应用并关闭或在所有窗口上完成。

如果您尝试运行该项目,您会发现它无法找到 application.main。为了解决这个问题,我们还有最后一步。在 Eclipse 的包资源管理器中右键单击 main.java。选择run as > run configurations,然后选择arguments tab。在 vm 参数中添加以下内容(模块路径指向您安装的 Java FX sdk):

--module-path C:\Programs\Java\javafx-sdk-13.0.1\lib --add-modules=ALL-MODULE-PATH

就是这样,您现在应该能够运行 Java FX 项目并看到一个默认窗口。 如果在 Mac OS 上运行,如果在显示窗口时遇到问题,请在启动 SWT 时取消选择选项 -XstartOnFirstThread 参数。

【讨论】:

【参考方案6】:

正如@Cristian 所提到的,创建一个单独的 Main 类似乎可以解决问题,无需任何其他参数。

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 运行时添加到 Eclipse?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javaFX中将光标更改为WAIT时线程化后台任务?

如何在 JavaFX 中将图像设置为按钮的大小

运行 JavaFx 媒体应用程序时出现模块错误

Java 11、JavaFX、Gradle、Eclipse,令人讨厌的失败消息

错误:缺少 JavaFX 运行时组件 - JavaFX 11 和 OpenJDK 11 以及 Eclipse IDE

如何强制 Java FX 场景刷新?