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

use*_*615 22 java java-11 javafx-11

我收到以下错误,因为Java 11将JavaFX排除在最新版本的一部分之外.

Error: JavaFX runtime components are missing, and are required to run
this application
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*eda 29

入门指南之后,这些是从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 - >窗口 - >首选项 - > Java - >构建路径 - >用户库 - >新建.将其命名为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();
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,编辑器不应该抱怨JavaFX类,因为我们已经包含了用户库.

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

--module-path C:\Users\<user>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls
Run Code Online (Sandbox Code Playgroud)

9最后,运行该项目.它应该工作正常.


Cri*_*ian 8

我想分享一下有关启动javafx 11应用程序的发现。我说的是一个现有的遗留javafx应用程序,该应用程序最初是在没有模块的情况下开发的(例如,带有Java 8)。

IMO最有趣的方法是下面的方法#2b,它要求更改最少,即不需要-module-path参数。我提到我正在使用Maven,所以请参阅。先前的答案第一步是在您的pom.xmlJavafx中添加依赖项。例如:

<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-controls</artifactId>
  <version>11.0.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

为了启动,我发现了几种选择:

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>
Run Code Online (Sandbox Code Playgroud)

之后,您可以从控制台窗口运行mvn exec:java,这将启动应用程序。Maven将负责将所有条目从类路径添加到模块路径。我想起了CTRL + ALT + TEclipse中的快捷方式,该快捷方式直接在IDE中打开一个终端窗口。

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

该项目点击右键>运行方式> Maven构建...。然后exec:java在“ 目标”文本框中输入。与以前的方法相比的优势:与Eclipse的集成度更高。并且调试方便。您只需要在Debug模式下重新启动启动配置即可。我想提醒一下,Eclipse启动配置可以.launch直接作为文件存储在项目目录(repo)中,因此可以由同事共享/重用。使用最后一个标签,常见,在编辑配置窗口。

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

右键单击主类>运行方式> Java应用程序。首次单击时,将创建一个新的启动配置。可能无法使用,因此您需要对其进行编辑(例如,工具栏中的“运行”按钮(带有播放图标)>运行配置>选择与您的班级相对应的一个。或者CTRL + click单击“ 播放”后在其上进行播放)。

然后在Arguments> VM arguments中添加它:

--module-path ${project_classpath:REPLACE_ME_WITH_YOUR_PROJECT_NAME} --add-modules javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)

因此,这里的窍门是使用${project_classpath}变量。因为否则,您应该需要准确地写出指向Javafx jar的路径,该路径在您的存储.m2库中。这样做会使启动配置不容易被同事重用。

2b)使用Eclipse进行启动而无需指定 -module-path

这是拉一块去抵抗,这是我发现的错误,有关Java 11模块“好玩”的5H之后。您的应用程序可以直接使用,而无需触摸-module-path。当然,javafx库仍然需要在您的类路径中(但这由mvn处理)。该诀窍是(参见),您的主要应用不应延伸Application(例如MyApplication下文)。如果是这种情况,请使用一个main()函数执行新类,例如:

<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-controls</artifactId>
  <version>11.0.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

注意

就我而言(即在Windows上,系统中具有默认的JDK 8),存在有关启动javafx的已知问题。解决方案是添加以下VM arg :-Djava.library.path=C:。因此,实际上对于上述所有4种方法,我都需要添加它。


car*_*005 8

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

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

--module-path <path to the javafx sdk> --add-modules=ALL-MODULE-PATH
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 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);
    //  }
}
Run Code Online (Sandbox Code Playgroud)