无法使用Ant构建JavaFX应用程序



我需要为ant创建构建文件来构建我的JavaFX项目,我搜索了很多,但没有任何帮助。它仍然显示错误,但正在编译。当我尝试运行jar文件时-异常。我尝试过不同的道路,但仍然一无所获
这是我的build.xml。

  <?xml version="1.0" encoding="UTF-8" ?>
<project name="JDBC Ant Project" default="default" basedir="." xmlns:**fx="javafx:com.sun.javafx.tools.ant"**(Uri is not registered)>
    <property name="src.dir" location="src"/>
    <property name="build.dir" location="classes"/>
    <property name="out.dir" location="out"/>
    <property name="docs.dir" location="docs"/>
    <property name="bin.dir" location="bin"/>
    <property name="lib.dir" location="lib"/>
    <property name="jar.name" value="javafxtest.jar"/>
    <property name="sdk.dir" location="/usr/lib/jvm/java-8-oracle/lib"/>
    <target name="default" depends="clean,compile">
        <path id="fxant">
            <filelist>
                <file name="/usr/lib/jvm/java-8-oracle/lib/ant-javafx.jar"/>
                <file name="/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar"/>
            </filelist>
        </path>
        <*taskdef*(Failed to load types) resource="com/sun/javafx/tools/ant/antlib.xml"
                 uri="javafx:com.sun.javafx.tools.ant"
                 classpathref="fxant"/>
        <fx:**application** id="HelloWorldID"
                        name="JDBC Java FX"
                        mainClass="Main"/>
        <fx:resources id="appRes">
            <fx:fileset dir="${out.dir}" includes="HelloWorld.jar"/>
        </fx:resources>
        <fx:jar destfile="${out.dir}/${jar.name}">
            <fx:application refid="HelloWorldID"/>
            <fx:resources refid="appRes"/>
            <fileset dir="${build.dir}"/>
        </fx:jar>
        <fx:**deploy width**="300" **height**="250"
                   **outdir**="." **embedJNLP**="true"
                   **outfile**="helloworld">
            <fx:**application** refId="HelloWorldID"/>
            <**fx:resources** refid="appRes"/>
            <**fx:info** title="JavaFX Hello World Application"
                     vendor="Oracle Corporation"/>
        </fx:**deploy**>
    </target>
    <target name="clean">
        <echo>Performing clean target</echo>
        <delete dir="${build.dir}"/>
        <delete dir="${docs.dir}"/>
        <delete dir="${out.dir}"/>
    </target>
    <target name="init">
        <echo>Performing init target</echo>
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${docs.dir}"/>
        <mkdir dir="${out.dir}"/>
    </target>
    <target name="compile" depends="clean, init">
        <echo>Performing compiling</echo>
        <javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}">
            <classpath refid="build.classpath"/>
        </javac>
    </target>
    <path id="build.classpath">
        <fileset dir="${lib.dir}" casesensitive="no">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <target name="javadoc" depends="compile">
        <javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}">
            <!-- Define which files / directory should get included, we include all -->
            <fileset dir="${src.dir}">
                <include name="**"/>
                <exclude name="**/resources/**"/>
            </fileset>
        </javadoc>
    </target>
    <target name="build" depends="compile">
        <jar destfile="${out.dir}/${jar.name}" basedir="${build.dir}">
            <manifest>
                <attribute name="Main-Class" value="Main"/>
            </manifest>
        </jar>
    </target>
    <target name="main" depends="compile, build, javadoc">
        <description>Main target</description>
    </target>
</project>

**在我的IDEA中是完全"红色"的(Intellij IDEA。
*带有下划线。

尽管如此,它还是使用ant-f build.xml构建的。但当我尝试运行jar文件时,我会遇到下一个异常。应用程序启动方法出现异常

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
.....
.....
Caused by: java.lang.IllegalStateException: Location is not set.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2438)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2413)
    at Main.start(Unknown Source)

使用JavaFX ant任务复制资源的更新

在我的输出jar文件中没有包含fxml、css和其他文件的文件夹。如果手动放它一切正常,怎么说蚂蚁偷偷包文件夹?

基于Java部署教程JavaFX Ant Tasks HelloWorld build.xml示例,并对其进行修改以添加resources目录(它是项目srcclassesdist目录的兄弟目录)。将fxmlcss放在resources目录中,以将它们包含在jar中。复制文件的目录结构将与resources目录的目录结构相匹配,因此,如果您只将它们放在没有子目录的resources目录中,这些文件将显示在jar文件的根目录中(因此,当您使用resources时,会相对于根目录引用它们(例如FXMLLoader.load(getResource("/main.fxml")))。我在没有测试的情况下进行了这些修改,因为我不再使用ant进行构建。

<property name="build.src.dir" value="src"/>
<property name="build.resources.dir" value="resources"/>
<property name="build.classes.dir" value="classes"/>
<property name="build.dist.dir" value="dist"/>
<target name="default" depends="clean,compile">
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
  uri="javafx:com.sun.javafx.tools.ant"
  classpath="${JAVA_HOME}/lib/ant-javafx.jar"/>
  <fx:application id="HelloWorldID"
    name="JavaFXHelloWorldApp"
    mainClass="HelloWorld"/>
  <fx:resources id="appRes">
    <fx:fileset dir="${build.dist.dir}" includes="HelloWorld.jar"/>
  </fx:resources>
  <fx:jar destfile="${build.dist.dir}/HelloWorld.jar">
    <fx:application refid="HelloWorldID"/>
    <fx:resources refid="appRes"/>
    <fileset dir="${build.classes.dir}"/>
    <fileset dir="${build.resources.dir}"/>
  </fx:jar>
  . . .
</target>

您可能有运行时问题,而不是构建问题

应用程序似乎构建良好,并且您在尝试运行应用程序时遇到运行时错误,这可能是由于应用程序代码中的问题,也可能是由于执行所需的资源不存在。

尝试一个不包含任何FXML的更简单的应用程序,然后构建并执行它——如果这比您的应用程序代码或将FXML资源复制到构建包的代码中的错误更有效的话。

JavaFX Ant任务的Intellij语法高亮显示

关于Intellij中的"URI未注册"错误,这有点转移注意力。这只是意味着您还没有向Idea注册fx命名空间的模式,因此Idea无法验证文档(并在XML标记上提供上下文相关的代码完成)。只要您在XML中没有出现语法或结构错误(您可能没有,或者ant可能会拒绝它),那么如果您愿意,就可以忽略这些错误消息。

你可以在这里找到更多信息:

  • Intellij Idea帮助-引用DTD或Schema

注意:我不认为Oracle为JavaFX ant任务提供完整的XML模式,因此您可能无法配置Idea来验证ant build.XML文件中的JavaFX ant任务元素。然而,这不应该阻止您构建应用程序——您的最佳策略可能是将Idea配置为忽略JavaFX-ant-tasks XML模式,这样它就不再在build.XML文件上显示烦人和误导性的红色突出显示。

替代技术

您可能会(也可能不会)发现使用JavaFX Maven插件或JavaFX Gradle插件比直接使用JavaFX Ant Tasks更适合您。

最新更新