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

问题描述 投票:3回答:1

我需要为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文件时,我会得到下一个异常。 Application start方法中的异常

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)
java ant javafx javafx-8
1个回答
2
投票

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

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

基于Java部署教程JavaFX Ant任务HelloWorld build.xml sample,并修改它以添加resources目录(这是项目srcclassesdist目录的兄弟)。将fxmlcss放在resources目录中,将它们包含在jar中。复制文件的目录结构将与资源目录的目录结构相匹配,因此如果您只将它们放在没有子目录的资源目录中,则文件将显示在jar文件的根目录中(因此当您使用时资源引用它们相对于根(例如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的simpler application并构建和执行 - 如果它的错误在您的应用程序代码中或在将FXML资源复制到构建包的代码中。

关于JavaFX Ant任务的Intellij语法高亮

关于Intellij中的“URI未注册”错误,这有点像红鲱鱼。它只是意味着您没有使用Idea注册fx命名空间的模式,因此Idea无法验证文档(并在XML标记上提供上下文相关的代码完成)。只要您没有在XML中创建语法或结构错误(您可能没有,或者ant可能会拒绝它),那么您可以根据需要忽略此类错误消息。

您可以在此处找到更多相关信息:

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

替代技术

您可能(或可能不)找到使用JavaFX Maven pluginJavaFX Gradle plugin比直接使用JavaFX Ant任务更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.