【问题标题】:Module not found: javafx.controls未找到模块:javafx.controls
【发布时间】:2019-06-01 00:12:38
【问题描述】:

我已经下载了 JavaFX SDK,解压它并在this instructions 之后设置了一个PATH_TO_FX 系统变量。我使用了以下代码示例:

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 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();
    }

    public static void main(String[] args) {
        launch();
    }
}

尝试使用建议的模式编译它:

javac --module-path $PATH_TO_FX --add-modules javafx.controls HelloFX.java

但是编译器抛出错误:找不到模块:javafx.controls。 Windows 10。Java 和 JavaFX 版本为 11.0.1

再次:我确实添加了 --add-modules javafx.controls

【问题讨论】:

  • 下载和解压 JavaFX 文件 (gluonhq.com/products/javafx) 对我有用。我有以下虚拟机选项:--add-exports=javafx.base/com.sun.javafx.reflect=ALL-UNNAMED --add-exports=javafx.graphics/com.sun.javafx.util=ALL-UNNAMED --module-path /opt/javafx-sdk-11.0.2/lib/ --add-modules=javafx.controls,javafx.media,javafx.fxml

标签: java


【解决方案1】:

我还必须包含“lib”目录:--module-path %PATH_TO_FX%;%PATH_TO_FX%\lib 才能编译。

【讨论】:

    【解决方案2】:

    我正在使用gradle 及以下build.gralde 对我来说很好(org.beryx.jlink 是构建独立发行版的可选)。

    plugins {
        id 'application'
        id 'org.openjfx.javafxplugin' version '0.0.5'
        id "org.beryx.jlink" version "2.3.0"  //optional for jlink
    }
    
    repositories {
        mavenCentral()
    }
    
    javafx {
        modules = [ 'javafx.controls' ]
    }
    
    mainClassName = 'gui.Main'
    

    【讨论】:

      【解决方案3】:

      问题分三步解决。

      1. 在命令行中使用 %PATH_TO_FX% 而不是 $PATH_TO_FX

      2. 重新创建变量(系统和用户)PATH_TO_FX 将其值括在引号中。由于目录“C:\Program Files\Java\javafx-sdk-11.0.1\”包含空格,导致报错“invalid flag”。

      3. 重新启动计算机以更新变量。

      【讨论】:

        【解决方案4】:

        由于 JavaFX 不包含在“默认”JDK 中,我发现解决此类问题的最简单方法是使用来自 Bellsoftware 的 LibericaJDK (11+),它再次包含了 JavaFX,以便更轻松地开发和运行 JavaFX应用程序。

        https://bell-sw.com/pages/java-11.0.4/

        【讨论】:

          【解决方案5】:

          确保您的模块列表中没有空格:

          --module-path PATH_TO_JAVAFX/lib --add-modules javafx.swing,javafx.graphics,javafx.fxml,javafx.media,javafx.controls
          

          【讨论】:

            【解决方案6】:

            helloFX.bat @echo 关闭 分类 设置 PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.2\lib" C: cd \development\java\javaFX

            rem javac --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml HelloFX.java javac --module-path %PATH_TO_FX% --add-modules javafx.controls HelloFX.java

            java --module-path %PATH_TO_FX% --add-modules javafx.controls HelloFX

            暂停

            【讨论】:

            • 你能添加一些表达式吗?仅使用命令行示例实际上很难理解,谢谢。
            【解决方案7】:

            运行命令时

            javac --module-path $PATH_TO_FX --add-modules javafx.controls HelloFX.java
            

            而不是写$PATH_TO_FX or %PATH%写路径本身就是

            javac --module-path C:\javafx-sdk-11.0.2\lib --add-modules javafx.controls HelloFX.java
            

            还要尝试确保您的目录没有任何空格。它给了我问题,它可能适用于带有空格的目录

            【讨论】:

              【解决方案8】:

              由于我使用 Maven,我不得不修改 pom.xml 文件以包含依赖项。
              pom.xml:

              <dependencies>
                      <dependency>
                          <groupId>org.openjfx</groupId>
                          <artifactId>javafx-controls</artifactId>
                          <version>13.0.2</version>
                      </dependency>
                      <dependency>
                          <groupId>org.openjfx</groupId>
                          <artifactId>javafx-media</artifactId>
                          <version>11.0.2</version>
                      </dependency>
              </dependencies>
              

              您可能需要根据您安装的版本修改版本号。

              【讨论】:

                【解决方案9】:

                我的解决方案与上面的略有不同:
                javac --module-path C:\other_program\javafx-sdk-17.0.1\lib\ --add-modules javafx.controls HelloFX.java
                我必须将lib 放在路径中,而不是像Arilou suggestion 那样将C:\other_program\javafx-sdk-17.0.1\ 放在一起。

                要执行编译后的文件“HelloFX.class”,您还可以包含lib 路径:
                java --module-path C:\other_program\javafx-sdk-17.0.1\lib\ --add-modules javafx.controls HelloFX

                运行时环境:
                操作系统:Windows 10
                PowerShell
                Java 15.0.1
                JavaFX 17.01

                【讨论】:

                  【解决方案10】:

                  如果您使用的是 Netbeans,则必须取消选中“保存时编译”,除非您收到此错误。

                  https://github.com/openjfx/openjfx-docs/issues/91#issuecomment-537354974

                  如果你想要截图

                  https://github.com/openjfx/openjfx-docs/issues/120#issuecomment-692805305

                  【讨论】:

                  • 请在您的答案中添加解释,而不仅仅是提供链接