JavaFX应用程序未从命令行运行/如何正确构建和导出



我读了几个小时的书,但找不到解决这个特定问题的线索。

我已经用Scenebuilder 2.0和Eclipse Luna构建了一个基本的JavaFX应用程序。它由一个主类、一个空css和一个基本控制器类组成,该类现在为一个按钮执行操作。

该应用程序被导出到一个jar中,应该在安装了JRE 1.6和Windows 1.7的Linux/Suse下运行。

在开发PC上,我安装了JRE 1.8和JDK 1.7。该应用程序已在Linunx系统上导出为JRE 1.6。

我做了一个Jar,想通过键入java -jar <pathToMyApp/jarname.jar>

线程"main"java.lang.NoClassDefFoundError:javafx/application/application"中出现异常

所以我读到,如果你想用命令行启动jar,你通常不能用右键导出等等来导出jar(Linux或Windows,无关紧要)。双击有效,命令行无效。因此,我使用了JavaFX项目附带的AntScript:build.fxbuild。我设置了名称参数等,然后单击"ant build.xml并运行"

控制台错误:

(Only one entry, actually there are 52):
 [javac] warning: C:Program Files (x86)Javajre8libextjfxrt.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.

​;

BUILD FAILED
************JavaFXTestbuildbuild.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

我读了很多书,只发现应该将JAVA_HOME路径设置为JDK,而不是JRE。这导致JavaFX无法正常工作,无法识别JavaFX特定的标记。

Ant脚本:(正在运行)

<?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}..libant-javafx.jar"/>
            <file name="${java.home}libjfxrt.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)Javajre8libext">
            <filename name="jfxrt.jar"/>    
        </fileset>
    </copy>
    <mkdir dir="project" />
    <copy todir="project">
        <fileset dir="D:EntwicklungworkspaceJavaFXTest">
            <include name="src/**" />
        </fileset>
    </copy>
    <copy todir="project">
        <fileset dir="D:EntwicklungworkspaceJavaFXTest">
            <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>

问题:如何正确导出?如何设置JAVA_HOME?我的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库,因为JavaFX版本在JRE的所有小修订版中都不相同(早于7u6的版本甚至不包括它)。

一个更好的解决方案可能是打包一个自包含应用程序,嵌入它自己的JRE,这样您就不依赖于目标计算机上安装的JRE。这样,您就可以使用JDK8进行开发,使用Java8和JavaFX8的所有酷的新功能,无论目标机器上安装了JRE,dit都可以工作。然而,缺点是包更大,并且需要为不同的操作系统提供特定的包。Oracle文档中的这一页是一个很好的起点。

否则,如果您想要更多关于ant构建脚本的帮助,您可能需要发布实际的脚本。显而易见的一点是,它试图使用JRE 8安装中的JavaFX库(它是为Java 8编译的,这是类文件格式的主要版本52),同时试图为Java 7(主要版本51)编译——因此该库不兼容。

编辑:经过进一步的挖掘,我认为如果您想部署到JRE 6,您需要下载JDK 6的JavaFX SDK-JDK 7附带的JavaFX版本可能无法在Java 6上工作。请注意,JavaFX for JDK 6仅适用于Windows(不再受支持),因此我认为您将无法部署到只有JRE 6的Linux机器上(当然,独立应用程序除外)。

相关内容

  • 没有找到相关文章

最新更新