如何解析 'import javafx cannot be resolved' in VSCode?
How to resolve 'import javafx cannot be resolved' in VSCode?
我正在开发一个简单的 JavaFX 程序,HelloFX。我执行诸如使用 ant 构建或启动之类的任务。我对此没有任何问题,它工作得很好,因此代码和库在 build.xml 中链接得很好,正如您在代码中看到的那样。
但是,VSCode 没有找到 JavaFX 并说 'import javafx cannot be resolved'。所以我想知道 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"/>
VSCode 有一个名为 Ant Target Runner 的 Ant 扩展。
安装后,您可以打开在根目录中包含 build.xml
文件的 JavaFX 项目。
我能够稍微修改一下您上面的构建,以便添加一个 run
目标,并且 运行 HelloFX
来自 here.
<?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。
最后,您可以添加与 中相同的 launcher.json
,这样您就可以直接 运行 应用程序,而无需 ant 任务(尽管我认为这不是您的目标).
我正在开发一个简单的 JavaFX 程序,HelloFX。我执行诸如使用 ant 构建或启动之类的任务。我对此没有任何问题,它工作得很好,因此代码和库在 build.xml 中链接得很好,正如您在代码中看到的那样。
但是,VSCode 没有找到 JavaFX 并说 'import javafx cannot be resolved'。所以我想知道 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"/>
VSCode 有一个名为 Ant Target Runner 的 Ant 扩展。
安装后,您可以打开在根目录中包含 build.xml
文件的 JavaFX 项目。
我能够稍微修改一下您上面的构建,以便添加一个 run
目标,并且 运行 HelloFX
来自 here.
<?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。
最后,您可以添加与 launcher.json
,这样您就可以直接 运行 应用程序,而无需 ant 任务(尽管我认为这不是您的目标).