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

37

由于Java 11将JavaFX排除在最新版本之外,我遇到了以下错误。

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

那么我该如何在Java 11中向Eclipse添加JavaFX呢? 谢谢。


1
你有按照入门指南吗?你成功完成了哪些步骤?然后在哪里失败了? - Naman
1
有一个与IntelliJ相关的类似问题,并提供了类似的建议。 - Naman
无法从Eclipse运行 - user3520615
1
你的 Eclipse 版本是什么?我已经在 4.9M3 上运行它了。 - José Pereda
请问您能分享一下步骤吗?我已经将JavaFX 11添加到类路径中,但仍无法从Eclipse启动我的应用程序。 - user3520615
显示剩余4条评论
6个回答

62

按照入门指南,以下是在Eclipse中运行JavaFX 11所需的步骤。

  1. 这里安装Eclipse 2018-09。

  2. 这里安装JDK 11。

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

  4. 这里下载JavaFX 11 ea。

  5. 创建用户库:Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New。将其命名为JavaFX11,并包括JavaFX 11-ea下的lib文件夹中的jar文件。

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

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

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

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

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


我有一个问题,怎样避免在虚拟机参数中指定模块路径?有没有办法从存储库中读取模块? - user3520615
1
你可以使用Maven或Gradle,其中JavaFX依赖项通过本地存储库自动管理。请参阅提到的Maven设置指南。 - José Pereda
1
您可以安装Oracle JDK 11,或者从该链接安装Open JDK 11,无需安装程序,只需将其解压到您喜欢的位置即可。 - José Pereda
1
@AndrewS 请看 https://openjfx.io/openjfx-docs/#IDE-Eclipse,一旦您下载了JavaFX SDK,将会出现一个包含每个模块的JAR文件的"lib"文件夹:javafx.base.jar, ... - José Pereda
提醒一下,如果你的JavaFX路径中有空格,当你在运行时使用它作为参数时,你应该将其用引号括起来。我刚遇到了这个问题。 - 3142 maple
显示剩余5条评论

15
我很愿意分享有关启动JavaFX 11应用程序的发现。 我指的是原先在没有模块的情况下开发的现有传统JavaFX应用程序(例如,使用Java 8)。
我认为最有趣的方法是以下的Method #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启动配置文件启动

右键单击项目 > 运行为 > Maven Build...,然后在Goals文本框中输入exec:java优点:比前一种方法更加集成到Eclipse中,并且易于调试。您只需要以调试模式重新启动启动配置即可。我想提醒一下,Eclipse启动配置可以直接存储为.launch文件,存储在项目目录(repo)中,因此可以与同事共享/重复使用。使用Edit Configuration窗口中的最后一个选项卡Common

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

右键单击主类 > 运行为 > Java Application。第一次单击时会创建一个新的启动配置文件;可能它不起作用,所以您需要编辑它(例如,在工具栏中点击带有播放图标的**Run按钮 > Run configurations > 选择与您的类对应的启动配置文件。或者在单击PlayCTRL + 单击它)。

然后在Arguments > VM arguments中添加以下内容:

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

这里的技巧是使用${project_classpath}变量。否则,您需要精确地编写路径以指向javafx jar,这些jar在您的.m2存储库中。这样做会使启动配置不易于同事重复使用。

2b) 在Eclipse中启动而无需指定-module-path

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

Application.launch(MyApplication.class);

注意

在我的情况下(即在Windows系统上,具有默认的JDK 8),启动JavaFX存在已知问题。解决方法是添加以下VM参数:-Djava.library.path=C:。因此,实际上对于上述提到的所有4种方法,我都需要添加这个参数。


Application.launch(MyApplication.class);应该放在哪里?我认为你需要给出整个文件的示例。 - Andrew S
1
2b) 这是一个非常好的观察,节省了我很多时间 - 谢谢! - Patter
2b) 对我也起作用,但它会产生以下警告: 不支持的JavaFX配置:类是从“未命名模块@eef29c6”加载的 - Tillmann

9

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

我通过更改上述参数以加载所有模块而不仅仅是javafx.controls来解决了这个问题:

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

也许这篇文章的好心人可以看一下这个链接: https://stackoverflow.com/questions/55689045/javafx-setup-in-eclipse-the-option-javafx-11-sdk-is-for-what 最好的问候! - carlao2005

5

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

1
使用Carlao2005的建议,我成功地编写了一份完整的指南,以便在Java SDK不再附带JavaFX的情况下,在Eclipse中使JavaFX正常工作。这假定您已经安装了带有E(FX)clipse插件的Eclipse和JavaFX SDK的安装程序。请注意,重要的是将JavaFX SDK安装在路径中没有空格的位置,因此C:/ Program Files不是一个好选择。
对于要构建的每个新Java FX项目,请执行此步骤。首先,转到< strong>文件>新建>其他,找到创建新< strong> Java FX项目 的选项。创建项目后,您会注意到它无法编译,因为Eclipse需要了解JavaFX库。 访问< strong>项目属性,然后找到< strong> Java构建路径 。选择< strong>库选项卡,然后选择< strong>模块路径。然后选择< strong>添加库按钮,然后选择< strong>用户库选项,最后按< strong>下一步。
在弹出的窗口中,选择新建并将库命名为JavaFX13。选择添加外部JAR,然后找到您的JavaFX 13安装目录下的lib文件夹,并选择所有.jar文件夹,然后应用并关闭或在所有窗口上点击完成。
如果您尝试运行该项目,则会发现它无法找到application.main。为了解决这个问题,我们还有最后一步。在Eclipse的包资源管理器中右键单击main.java,选择运行为 >运行配置,然后选择参数选项卡。在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选项。


1

@José Pereda是完全正确的,一切都按照应该的方式运作。我已经使用Eclipse 2018-12版本进行了测试。因此,在您下载IDE(https://www.eclipse.org/downloads/packages/release/2018-12/r/eclipse-ide-java-developers)并安装e(fx)clipse插件之后,您应该能够在工作区中创建一个“JavaFx项目”项。

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

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

JavaFX SDK for deletion

最后一步是在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/),解压并使用上述虚拟机参数中的"lib"文件夹路径。

5
为什么在Maven应该负责依赖管理的情况下,一个人还需要手动下载整个Java Fx SDK呢? - shawn1874

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接