我需要为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
目录(它是项目src
、classes
和dist
目录的兄弟目录)。将fxml
和css
放在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更适合您。