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

时间:2015-03-16 20:13:40

标签: java ant javafx javafx-8

我需要为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>

**完全&#34;红色&#34;在我的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)

1 个答案:

答案 0 :(得分: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语法高亮显示

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

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

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

替代技术

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