gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:33:39 28 4
gpt4 key购买 nike

我花了几个小时读了很多书,但找不到解决这个具体问题的任何线索。

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

应用程序已导出到 jar,并且应在安装了 JRE 1.6 的 Linux/Suse 下运行,也可能在 Windows 1.7 下运行。

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

我制作了一个 Jar 并想通过键入来启动应用程序 java -jar <pathToMyApp/jarname.jar>

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

所以我读到,如果你想用命令行启动它(Linux 或 Windows,没关系),你通常不能使用 rightlick 导出等导出 jar。双击有效,命令行不行。所以我使用了JavaFX项目附带的AntScript:build.fxbuild。我设置了名称参数等,然后单击“ant build.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.

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

我做了很多阅读,发现你应该将 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}\..\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>

问题:如何正确导出? 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。这样,您就可以使用 JDK 8 进行开发,使用 Java 8 和 JavaFX 8 的所有炫酷新功能,无论目标计算机上安装了 JRE,dit 都可以工作。然而,缺点是软件包较大,并且需要针对不同操作系统有特定的软件包。一个好的起点是 this page在 Oracle 文档中。

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

编辑:经过更多挖掘,我认为如果您想部署到 JRE 6,则需要下载 JavaFX SDK for JDK 6 - JDK 7 附带的 JavaFX 版本可能无法在 Java 6 上运行。请注意,JavaFX for JDK 6 仅适用于 Windows(并且不再受支持),因此我认为您无法仅使用 JRE 6 即可部署到 Linux 计算机(当然,自包含应用程序除外)。

关于JavaFX 应用程序未从命令行运行/如何正确构建和导出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745775/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com