[英]How to resolve 'import javafx cannot be resolved' in VSCode?
我正在開發一個簡單的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"/>
VSCode有一個Ant擴展,名為Ant Target Runner 。
安裝后,可以在根目錄下打開包含build.xml
文件的JavaFX項目。
我能夠在上面修改一下你的構建,以便添加一個run
目標,並從這里運行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。
最后你可以像這里一樣添加相同的launcher.json
,這樣你就可以直接運行app,而不需要ant任務(雖然我認為這不是你的目標)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.