带有VSCode的JavaFX-11

Bra*_*rds 6 javafx visual-studio-code java-11 javafx-11

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

[Java] The import javafx cannot be resolved
Run Code Online (Sandbox Code Playgroud)

在Eclipse中,这由“用户库”处理,该库在.classpath中生成一个条目

<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11">
    <attributes>
        <attribute name="module" value="true"/>
    </attributes>
</classpathentry>
Run Code Online (Sandbox Code Playgroud)

尽管VSCode似乎可以从Eclipse理解.classpath的其余部分,但它不理解这一点。用磁盘上的实际位置替换path属性也不起作用。

为了清楚起见:

  • 这个问题专门与Java 11有关。在早期的Java版本中,JavaFX是JDK的一部分。在Java 11中,它已移至一组外部模块。
  • 我不想使用Maven或Gradle。我需要不使用构建工具直接引用模块。

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

Jos*_*eda 12

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

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

JavaFX错误

显然,这意味着JavaFX类无法解析,即使.classpath文件中存在一个条目,也是如此:

<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11"/>
Run Code Online (Sandbox Code Playgroud)

该库无法解析。

解决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"/>
Run Code Online (Sandbox Code Playgroud)

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

JavaFX SDK

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

解决JRE

我们需要为该项目设置JDK 11,因此请从此处下载它。然后打开Eclipse并将其添加到已安装的JRE中。我看到Java -> Installed JREs -> Execution Environments11版本的名称是JavaSE-11

.classpathhelloFX项目中的文件还包含对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>
Run Code Online (Sandbox Code Playgroud)

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

解决JAVA_HOME

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

这可以在settings.json`Preferences-> Settings-> Workspace Settings中完成:

{
   "java.dependency.packagePresentation": "hierarchical",
   "java.home":"/Users/<user>/Downloads/jdk-11.0.2.jdk/Contents/Home"
}
Run Code Online (Sandbox Code Playgroud)

Java主页

修改后,您会看到一条带有消息的弹出窗口Java Language Server configuration changed, please restart VS Code.,因此请重新启动它。

尝试一下

我们可以看到没有错误,甚至还有一个bin文件夹,其结果是VSCode自动完成的。

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

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

错误JavaFX丢失

这是使用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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在我们已经准备好一切。

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

运行JavaFX 11

请注意,我是VSCode的首次用户,因此我可能错过了一些显而易见的东西,也许可以避免或简化其中的一些步骤。

  • @Sedrick 是的,我知道它只有一行,但我将其拆分以便读者可以看到 `--add-modules` 部分。 (3认同)
  • 哇 - 多么好的和非常彻底的答案!有趣的是,根本不需要设置java.home。但是,如果您想设置它,settings.json 文件可能不在指定的位置。要可靠地访问它,请打开命令面板 (Ctrl-Shft-P),然后选择命令“打开设置 (JSON)”。这将打开一个不错的编辑器,您可以在其中访问用户、工作区和文件夹设置。 (2认同)