带有 VSCode 的 JavaFX-11

标签 javafx visual-studio-code java-11 javafx-11

我必须在这里遗漏一些明显的东西......我正在尝试使用 VSCode(来自 Eclipse),但我无法让 VSCode 看到 JavaFX11 库。在 import 语句中,所有对 JavaFX 组件的引用都被标记:

[Java] The import javafx cannot be resolved

在 Eclipse 中,这是通过“用户库”处理的,它在 .classpath 中生成一个条目
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11">
    <attributes>
        <attribute name="module" value="true"/>
    </attributes>
</classpathentry>

虽然 VSCode 似乎从 Eclipse 中理解了 .classpath 的其余部分,但它并不理解这一点。用磁盘上的实际位置替换路径属性也不起作用。

为了清楚起见:
  • 这个问题专门针对 Java 11。在早期的 Java 版本中,JavaFX 是 JDK 的一部分。在 Java 11 中,它已移至一组外部模块。
  • 我不想使用 Maven 或 Gradle。我需要直接引用模块而不使用构建工具。

  • 另外,如果 VSCode 也可以直接执行 JavaFX 应用程序,那就太好了。但是,如果我必须使用显式模块和类路径从命令行启动应用程序,这是可以接受的

    最佳答案

    我将从 the OpenJFX samples 运行 Eclipse 的 HelloFX 示例。 .

    使用 VSCode 打开示例后,我看到报告的错误:[Java] The import javafx cannot be resolved [268435846] .

    JavaFX Error

    这显然意味着 JavaFX 类没有被解析,即使 .classpath 文件中有一个条目:

    <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11"/>
    

    该库无法解析。

    解决JavaFX SDK

    因此,我将用本地 JavaFX SDK 中的实际 jar 替换该变量。 :
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.base.jar"/>
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.graphics.jar"/>
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.controls.jar"/>
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.fxml.jar"/>
    

    刷新项目后,可以在JAVA DEPENDENCIES下看到这些 jar 。

    JavaFX SDK

    虽然错误似乎已解决,但该项目仍然无法构建。

    解决JRE

    我们需要为项目设置JDK 11,所以从here下载.然后打开 Eclipse 并将其添加到已安装的 JRE。我在 Java -> Installed JREs -> Execution Environments 下看到11 版本的名称是 JavaSE-11 .
    .classpath来自 helloFX 项目的文件还包含对 JRE 的引用:
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/
        org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JDK11">
        <attributes>
            <attribute name="module" value="true"/>
        </attributes>
    </classpathentry>
    

    所以我要替换JDK11JavaSE-11 ,并刷新项目。我可以在 JAVA DEPENDENCIES 下看到有对 JRE System Library [JavaSE-11] 的引用.

    解决JAVA_HOME

    我们需要设置java.home在 VS 代码中。

    这可以在 settings.json 中完成。从`首选项->设置->工作区设置:
    {
       "java.dependency.packagePresentation": "hierarchical",
       "java.home":"/Users/<user>/Downloads/jdk-11.0.2.jdk/Contents/Home"
    }
    

    JavaHome

    修改后,你会得到一个弹出消息Java Language Server configuration changed, please restart VS Code. ,所以重新启动它。

    试用

    我们可以看到没有错误,甚至还有一个bin包含 VSCode 自动执行的构建结果的文件夹。

    我们可以运行它吗?如果我们尝试一下,我们会得到一个错误:
    Error: JavaFX runtime components are missing, and are required to run this application
    

    Error JavaFX missing

    这是在不指定模块路径的情况下使用 JavaFX 11 时出现的错误。

    解决 VM 参数

    最后一步是添加所需的 vm 参数。

    这可以在 launch.json 中完成。文件。它包含一个默认配置,我们可以修改它为 vmArgs 添加一个新条目包括 --module-path带有 JavaFX SDK 的本地路径和 --add-modules使用所需的 JavaFX 模块:
    {
        "configurations": [
            {
                "type": "java",
                "name": "CodeLens (Launch) - Main",
                "request": "launch",
                "vmArgs": "--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib
                    --add-modules javafx.controls,javafx.fxml",
                "mainClass": "hellofx.Main",
                "projectName": "hellofx"
            }
        ]
    }
    

    现在我们已经设置好了一切。

    再次运行该项目,它应该可以工作。

    Running JavaFX 11

    请注意,我是 VSCode 的第一次用户,所以我可能遗漏了一些明显的东西,也许其中一些步骤可以避免或简化。

    关于带有 VSCode 的 JavaFX-11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349894/

    相关文章:

    从构建的 JRT 模块运行应用程序时,从 URL 构造的 JavaFX 11 javafx.scene.image 抛出 SSLHandshakeException

    JavaFX 在 EventHandler 中使用父类(super class)

    c - 有没有办法防止 Vscode 在导航代码时切换窗口?

    java - 是否可以在 Maven payara-micro-maven-plugin 中设置端口以避免 "address already in use"运行多个实例?

    使用 Optionals 对多个属性进行 Java 空检查

    java - jlink生成的自定义JRE具有较大的尺寸,而Jre最小

    java - 在多屏幕设置中的 Activity 屏幕或监视器上打开 JavaFX 应用程序

    java - 使用 JDK 1.8.0u131 和 NetBeans 8.2 在 Windows XP 32 位上,: d3d, sw 的图形设备初始化失败

    visual-studio-code - RM : cannot remove ‘.vscode-server/bin/xxxxxx/.nfs000000000xxxxxxxxxxxx’ : Device or resource busy

    css - 如何在 vscode 中配置 stylelint 扩展?