【问题标题】:How to resolve 'import javafx cannot be resolved' in VSCode?如何解决 VSCode 中的“无法解析导入 javafx”?
【发布时间】:2019-06-12 11:26:50
【问题描述】:

我正在开发一个简单的 JavaFX 程序,HelloFX。我执行诸如使用 ant 构建或启动之类的任务。我对此问题为零,它运行良好,因此代码和库在 build.xml 中很好地链接,正如您在代码中看到的那样。

但是,VSCode 没有找到 JavaFX 并说“无法解析导入 javafx”。所以我想知道 VSCode 如何找到 Java 依赖项?他怎么能像蚂蚁一样找到 JavaFX 呢?我以为 VSCode 是使用 build.xml 来查找依赖的,所以,也许我错了,或者我的 build.xml 不好。

提前感谢您的帮助!

<project name="HelloFX" basedir="." default="rebuild-run">



<property name="src.dir"     value="src"/>
<property name="lib.dir"     value="/home/rafael/javafx-sdk-12.0.1/lib"/>
<path id="classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<property name="build.dir"   value="bin"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir"     value="${build.dir}/jar"/>

<property name="main-class"  value="${ant.project.name}"/>


<target name="clean">
    <delete dir="${build.dir}"/>
</target>

<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" modulepath="/home/rafael/javafx-sdk-12.0.1/lib">
        <compilerarg line="--add-modules javafx.controls"/> 
    </javac>
</target>

<target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
        </manifest>
    </jar>
</target>

<target name="run" depends="jar">
    <java fork="true" classname="${main-class}"  modulepath="/home/rafael/javafx-sdk-12.0.1/lib" >
        <jvmarg line="--add-modules javafx.controls"/>
        <sysproperty key="java.library.path" path="$(lib.dir)"/>
        <classpath>
            <path refid="classpath"/>
            <path location="${jar.dir}/${ant.project.name}.jar"/>
        </classpath>
    </java>
</target>

<target name="rebuild" depends="clean,jar"/>

<target name="rebuild-run" depends="clean,run"/>

【问题讨论】:

标签: java javafx visual-studio-code ant


【解决方案1】:

VSCode 有一个 Ant 扩展,名为 Ant Target Runner

安装后,您可以在根目录中打开包含build.xml 文件的JavaFX 项目。

我能够稍微修改您上面的构建,以便添加一个run 目标,并从here 运行HelloFX

<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloFX" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">

<property name="src.dir"     value="src"/>
<property name="lib.dir"     value="/Users/user/Downloads/javafx-sdk-12.0.1/lib"/>
<path id="classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<property name="build.dir"   value="bin"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir"     value="${build.dir}/jar"/>

<property name="main-class"  value="hellofx.Main"/>

<property environment="env"/>
<target name="clean">
    <!-- Verify that JDK is 11+ -->
    <echo message="JAVA_HOME is set to = ${env.JAVA_HOME}" />
    <delete dir="${build.dir}"/>
</target>

<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" modulepath="/Users/user/Downloads/javafx-sdk-12.0.1/lib">
        <compilerarg line="--add-modules javafx.controls,javafx.fxml"/> 
    </javac>
    <copy todir="${classes.dir}">
    <fileset dir="src"
             includes="**/*.fxml,**/*.properties,**/*.css" />
</copy>
</target>

<target name="run" depends="jar">
    <java fork="true" modulepath="/Users/user/Downloads/javafx-sdk-12.0.1/lib" jar="${jar.dir}/${ant.project.name}.jar">
        <jvmarg line="--add-modules javafx.controls,javafx.fxml"/> 
    </java>
</target>

<target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
        </manifest>
    </jar>
</target>
</project>

每次修改文件并保存时,都会重新加载 ant 目标面板并显示目标:

如果您运行任何目标,输出将显示在终端中。

确保您选择了 JDK 11+(我已向 clean 目标添加了回显)。如果不是这种情况,您可以直接从同一终端 (export JAVA_HOME=...) 进行设置。

然后您可以运行run 目标并让应用正常运行:

请注意,虽然这可以正常工作,但使用 Maven 或 Gradle 等构建工具会更方便。

让 IDE 使用 JavaFX 库

默认情况下,您将收到一条警告消息Classpath is incomplete,并且JavaFX 类没有自动完成功能。

由于 VSCode 需要 Maven pom.xml 或 Eclipse .classpath 文件,我将添加后者:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="bin/classes" path="src/">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="false"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="lib" path="/Users/user/Downloads/javafx-sdk-12.0.1/lib/javafx.base.jar"/>
    <classpathentry kind="lib" path="/Users/user/Downloads/javafx-sdk-12.0.1/lib/javafx.graphics.jar"/>
    <classpathentry kind="lib" path="/Users/user/Downloads/javafx-sdk-12.0.1/lib/javafx.controls.jar"/>
    <classpathentry kind="lib" path="/Users/user/Downloads/javafx-sdk-12.0.1/lib/javafx.fxml.jar"/>

    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-12">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
</classpath>

这似乎解决了 JavaFX 语法和自动完成的问题。请注意,这可能需要安装 Eclipse。

最后,您可以添加与here 中相同的launcher.json,这样您就可以直接运行应用程序,而无需执行 ant 任务(尽管我认为这不是您的目标)。

【讨论】:

  • 非常感谢您的完整回答。但是,我在使用 ant 和 VSCode 时遇到了很多麻烦,因为我也想使用 TestFX。所以现在我正在尝试 Eclipse 和 Maven。
  • 不仅构建工具 (Maven/Gradle) 对您的项目有真正的帮助,而且传统的 Java IDE 和新的 IDE(如 VSCode)也不再保持 ant 构建的更新。所以建议尽快转向构建工具......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 2022-10-24
  • 2014-04-18
  • 2020-02-09
相关资源
最近更新 更多