JavaFX-11 与 VSCode

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

我一定在这里遗漏了一些明显的东西...我正在尝试使用 VSCode(来自 Eclipse),但我无法让 VSCode 查看 JavaFX11 库。在导入语句中,所有对 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 returned [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

helloFX 项目中的 .classpath 文件还包含对 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>

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

解决 JAVA_HOME

我们需要在 VSCode 中设置 java.home

这可以在“首选项”->“设置”->“工作区设置”的 settings.json 中完成:

{
   "java.dependency.packagePresentation": "hierarchical",
   "java.home":"/Users/<user>/Downloads/jdk-11.0.2.jdk/Contents/Home"
}

JavaHome

修改后,您将收到一个弹出窗口,其中显示消息Java语言服务器配置已更改,请重新启动 VS Code。,因此重新启动它。

尝试一下

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

我们可以运行它吗?如果我们尝试一下,我们会得到一个错误:

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

Error JavaFX missing

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

解决 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 的首次用户,因此我可能错过了一些明显的东西,也许其中一些步骤可以避免或简化。

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

相关文章:

java - 失败@应用程序启动方法(JavaFX 11、JDK 14 和 Intellij)

android - 如何为flutter应用添加 '.in'域以避免Android资源链接错误?

html - 将 .pug 编译为 html 后加载外部 CSS

javafx动画循环

java - 两个同步的 ScrollPanes 未对齐

java.awt.HeadlessException 从 Kotlin REPL 启动 JavaFX 应用程序

node.js - 在 vscode 扩展中执行 Electron 应用程序

java - JDK 11 中是否有 CORBA 的替代库

java - 简单的 Java 11 JavaFX 程序,从 JAR 文件运行时出错 (Windows)

java - JDK 11 上的 RabbitMQ 客户端 SSL 握手问题