Как решить «импорт javafx не может быть разрешен» в VSCode? - PullRequest
0 голосов
/ 12 июня 2019

Я работаю над простой программой JavaFX, HelloFX.Я выполняю такие задачи, как сборка или запуск с помощью ant.У меня нет проблем с этим, он работает отлично, поэтому код и библиотеки хорошо связаны в build.xml, как вы можете видеть в коде.

Но VSCode не находит JavaFX и говорит, что 'import 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"/>

1 Ответ

0 голосов
/ 13 июня 2019

Существует расширение Ant для VSCode с именем Ant Target Runner .

После его установки вы можете открыть свой проект JavaFX, содержащий файл build.xml в корневом каталоге..

Мне удалось немного изменить вышеописанную сборку, чтобы добавить цель 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>

Каждый раз, когда вы изменяете файл и сохраняете его, целевая панель муравья перезагружается и отображаются цели:

VSCode with Ant

Если вы запускаете любой изцели, выходные данные отображаются в терминале.

Убедитесь, что выбран JDK 11+ (я добавил эхо к цели clean).Если это не так, вы можете установить его непосредственно с того же терминала (export JAVA_HOME=...).

Затем вы можете запустить цель run и заставить приложение работать:

Running Ant from VSCode

Обратите внимание, что, хотя это работает нормально, будет удобнее использовать инструменты сборки, такие как 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.

JavaFX syntax

Наконец, вы можете добавить то же launcher.json, что и в здесь , так что вымогу запустить приложение напрямую, без задач ant (хотя я так понимаю, это не ваша цель).

...