JavaFX应用程序未从命令行运行/如何正确构建和导出?
我花了几个小时读了很多书,但找不到关于这个具体问题的线索 我已经用SceneBuilder2.0和EclipseLuna构建了一个基本的JavaFX应用程序。 它由一个主类、一个空的css和一个基本的控制器类组成,该类现在执行一个按钮的操作 该应用程序被导出到jar中,应该在安装了JRE 1.6的Linux/Suse下运行,可能还有Windows 1.7 在开发PC上,我安装了JRE 1.8和JDK 1.7。该应用程序是为Linunx系统上的JRE 1.6导出的 我制作了一个Jar,想通过键入JavaFX应用程序未从命令行运行/如何正确构建和导出?,java,eclipse,ant,jar,javafx-8,Java,Eclipse,Ant,Jar,Javafx 8,我花了几个小时读了很多书,但找不到关于这个具体问题的线索 我已经用SceneBuilder2.0和EclipseLuna构建了一个基本的JavaFX应用程序。 它由一个主类、一个空的css和一个基本的控制器类组成,该类现在执行一个按钮的操作 该应用程序被导出到jar中,应该在安装了JRE 1.6的Linux/Suse下运行,可能还有Windows 1.7 在开发PC上,我安装了JRE 1.8和JDK 1.7。该应用程序是为Linunx系统上的JRE 1.6导出的 我制作了一个Jar,想通过键入
java-jar
线程“main”java.lang.NoClassDefFoundError中出现异常:javafx/application/application
所以我读到,如果你想用命令行(Linux或Windows,没关系)启动jar,你通常不能用rightlick导出等等来导出jar。双击有效,命令行无效。所以我使用了JavaFX项目附带的AntScript:build.fxbuild。我设置了名称参数等等,然后单击“antbuild.xml并运行”
控制台中的错误:
(Only one entry, actually there are 52):
[javac] warning: C:\Program Files (x86)\Java\jre8\lib\ext\jfxrt.jar(javafx/application/Application.class): major version 52 is newer than 51, the highest major version supported by this compiler.
[javac] It is recommended that the compiler be upgraded.
生成失败
****\****\****\JavaFXTest\build\build.xml:84:问题:无法创建任务或键入javafx:com.sun.javafx.tools.ant:resources
原因:名称未定义。
措施:检查拼写。
操作:检查是否已声明任何自定义任务/类型。
措施:检查是否发生了任何/声明。
尚未在此命名空间中定义任何类型或任务
我读了很多书,只发现应该将JAVA_主路径设置为JDK,而不是JRE。这导致JavaFX无法正常工作,无法识别JavaFX特定的标记
Ant脚本:(正在运行)
问题:如何正确导出?如何设置JAVA_主页?JavaFX的启动命令是否错误?JRE 1.8和JDK 1.7之间是否存在版本冲突?首先:“线程中的异常”main“java.lang.NoClassDefFoundError:javafx/application/application”。这是因为JavaFX库在类路径中不可用。这些库在JRE 6中根本不存在。它们包含在JRE 7中(从版本7u6开始),但默认情况下也不在类路径上。我认为,如果您为Java 6编译,并且在jar中包含jfxrt.jar库(来自JDK 7),就有可能让应用程序在JRE 6上运行
请注意,即使您的目标是Java 7+,您仍然应该在jar中包含jfxrt.jar库,因为在JRE的所有次要修订版中,JavaFX版本都不相同(而早于7u6的版本甚至不包含它)
更好的解决方案可能是打包一个自包含的应用程序,嵌入它自己的JRE,这样您就不必依赖安装在目标机器上的JRE。这样,您就可以使用JDK8进行开发,使用Java8和JavaFX8的所有新特性,dit将可以工作,而不管目标机器上安装了什么JRE。然而,缺点是软件包更大,并且需要为不同的操作系统提供特定的软件包。Oracle的文档是一个很好的起点
否则,如果您想在ant构建脚本方面获得更多帮助,您可能需要发布实际的脚本。一件很明显的事情是,它试图使用JRE 8安装中的JavaFX库(它是为Java 8编译的,Java 8是类文件格式的主要版本52),同时尝试为Java 7(主要版本51)编译,因此该库不兼容
编辑:在进一步挖掘之后,我认为如果您想部署到JRE 6,您需要下载-JDK 7附带的JavaFX版本可能无法在Java 6上工作。请注意,JavaFX for JDK 6仅适用于Windows(并且不再受支持),因此我认为您无法仅使用JRE 6(当然,自包含的应用程序除外)部署到Linux机器上。获得了默认的ant脚本,该脚本随JavaFX项目一起运行!通过将其执行环境更改为JDK而不是JRE,它最终构建了应用程序,并制作了一个jar,正如e(fx)clipse教程中所解释的那样。但是同样的(无论是否在构建路径中jfxrt.jar),我得到了相同的错误:Linux上不支持的major.minor版本52.0错误。添加jfxrt.jar已经起作用,但仍然存在相同的错误。关于如何使用命令行中的jar运行它,而不使用自包含包(大小很重要!),还有其他提示吗?谢谢你!我编辑了关于在JRE 6上使用JavaFX的帖子。请注意,您似乎仍然有另一个问题,因为版本52是Java8,而不是Java7。我之所以要求使用ant构建脚本,是因为我不知道Eclipse生成的脚本应该是什么样子(我不使用Eclipse),还因为脚本应该包含一些交互信息,比如所使用的ant-javafx.jar的路径。另外,您是否尝试过使用-v选项(详细模式)运行ant脚本?它应该显示更有用的信息
BUILD FAILED
****\****\****\JavaFXTest\build\build.xml:84: Problem: failed to create task or type javafx:com.sun.javafx.tools.ant:resources
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
No types or tasks have been defined in this namespace yet
<?xml version="1.0" encoding="UTF-8"?>
<project name="JavaFXTest" default="do-deploy" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
<target name="init-fx-tasks">
<path id="fxant">
<filelist>
<file name="${java.home}\..\lib\ant-javafx.jar"/>
<file name="${java.home}\lib\jfxrt.jar"/>
</filelist>
</path>
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant"
classpathref="fxant"/>
</target>
<target name="setup-staging-area">
<delete dir="externalLibs" />
<delete dir="project" />
<delete dir="projectRefs" />
<mkdir dir="externalLibs" />
<copy todir="externalLibs">
<fileset dir="C:\Program Files (x86)\Java\jre8\lib\ext">
<filename name="jfxrt.jar"/>
</fileset>
</copy>
<mkdir dir="project" />
<copy todir="project">
<fileset dir="D:\Entwicklung\workspace\JavaFXTest">
<include name="src/**" />
</fileset>
</copy>
<copy todir="project">
<fileset dir="D:\Entwicklung\workspace\JavaFXTest">
<include name="utils4j/**" />
</fileset>
</copy>
<mkdir dir="projectRefs" />
</target>
<target name='do-compile'>
<delete dir="build" />
<mkdir dir="build/src" />
<mkdir dir="build/libs" />
<mkdir dir="build/classes" />
<!-- Copy project-libs references -->
<copy todir="build/libs">
<fileset dir="externalLibs">
<include name="jfxrt.jar"/>
</fileset>
</copy>
<!-- Copy project references -->
<!-- Copy project sources itself -->
<copy todir="build/src">
<fileset dir="project/utils4j">
<include name="**/*"/>
</fileset>
</copy>
<copy todir="build/src">
<fileset dir="project/src">
<include name="**/*"/>
</fileset>
</copy>
<javac includeantruntime="false" source="1.6" target="1.6" srcdir="build/src" destdir="build/classes" encoding="Cp1252">
<classpath>
<fileset dir="build/libs">
<include name="*"/>
</fileset>
</classpath>
</javac>
<!-- Copy over none Java-Files -->
<copy todir="build/classes">
<fileset dir="project/utils4j">
<exclude name="**/*.java"/>
</fileset>
<fileset dir="project/src">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="do-deploy" depends="setup-staging-area, do-compile, init-fx-tasks">
<delete file="dist"/>
<delete file="deploy" />
<mkdir dir="dist" />
<mkdir dir="dist/libs" />
<copy todir="dist/libs">
<fileset dir="externalLibs">
<include name="*" />
</fileset>
</copy>
<fx:resources id="appRes">
<fx:fileset dir="dist" includes="JavaFXTest.jar"/>
<fx:fileset dir="dist" includes="libs/*"/>
</fx:resources>
<fx:application id="fxApplication"
name="AMAN_JAVAFX"
mainClass="application.Main"
toolkit="fx"
/>
<mkdir dir="build/classes/META-INF" />
<fx:jar destfile="dist/JavaFXTest.jar">
<fx:application refid="fxApplication"/>
<fileset dir="build/classes">
</fileset>
<fx:resources refid="appRes"/>
<manifest>
<attribute name="Implementation-Vendor" value="me"/>
<attribute name="Implementation-Title" value="AMAN_JAVAFX"/>
<attribute name="Implementation-Version" value="1.0"/>
<attribute name="JavaFX-Feature-Proxy" value="None"/>
</manifest>
</fx:jar>
<mkdir dir="deploy" />
<!-- Need to use ${basedir} because somehow the ant task is calculating the directory differently -->
<fx:deploy
embedJNLP="false"
extension="false"
includeDT="false"
offlineAllowed="true"
outdir="${basedir}/deploy"
outfile="JavaFXTest" nativeBundles="none"
updatemode="background" >
<fx:info title="JavaFXTest" vendor="me"/>
<fx:application refId="fxApplication"/>
<fx:resources refid="appRes"/>
</fx:deploy>
</target>
</project>