【发布时间】:2016-03-06 12:40:55
【问题描述】:
我正在使用 Oracle“自包含应用程序打包”工具为 JavaFX 8 桌面应用程序创建一个 .deb 文件。生成的包文件可以在 Ubuntu 上毫无问题地安装,但应用程序无法运行。文件安装如下:
$ sudo dpkg -i vocabhunter-1.0.14.deb
但是,尝试运行应用程序会产生以下错误:
$ /opt/VocabHunter/VocabHunter
VocabHunter Failed to locate JNI_CreateJavaVM
VocabHunter Failed to launch JVM
重要的是,我正在生成一个不包含 JRE 的捆绑包,在调查中,问题似乎与此有关。生成的文件/opt/VocabHunter/app/VocabHunter.cfg 包含以下行:
app.runtime=
如果我编辑它并添加到 Java 的路径,程序将毫无问题地启动。作为一种解决方法,我建议在安装 .deb 捆绑包后,用户运行以下命令:
sudo sed -i "s|app.runtime=.*|app.runtime=$JAVA_HOME|g" /opt/VocabHunter/app/VocabHunter.cfg
但是,这会使用户感到困难。有谁知道如何修复 JavaFX 打包工具的配置以避免这个问题?
构建使用 Gradle 调用 Ant 脚本来生成包。 Gradle 填充了所有必要的变量。 Ant脚本如下:
<project name="VocabHunter Packaging" basedir=""
xmlns:fx="javafx:com.sun.javafx.tools.ant">
<property environment="env"/>
<property name="JAVA_HOME" value="${env.JAVA_HOME}"/>
<target name="jfxbundle" description="Build the application bundle">
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant"
classpath="${JAVA_HOME}/lib/ant-javafx.jar"/>
<fx:deploy outdir="${basedir}/build"
nativeBundles="${packageType}">
<fx:platform basedir=""/>
<fx:application id="VocabHunterId"
name="VocabHunter"
mainClass="${mainClass}"
version="${version}"/>
<fx:resources>
<fx:fileset dir="${basedir}/build/libs"/>
</fx:resources>
<fx:info title="VocabHunter">
<fx:association description="VocabHunter session"
extension="wordy"
mimetype="application/x-vnd.VocabHunterSession"
icon="${sessionIcon}"/>
</fx:info>
<fx:bundleArgument arg="icon"
value="${appIcon}"/>
<fx:bundleArgument arg="mac.CFBundleVersion"
value="${version}"/>
<fx:bundleArgument arg="launcher-cfg-format"
value="prop"/>
</fx:deploy>
</target>
</project>
您可以在上下文here 中查看完整的脚本。
我正在 Ubuntu 14.04 上使用 JDK 1.8.0_92 对此进行测试。
【问题讨论】:
-
这可能与my question 中的相同。另请查看bugs.openjdk.java.net/browse/JDK-8143314 和bugs.openjdk.java.net/browse/JDK-8143934 的两个错误报告。后者应该用 8u76 解决。
-
嗨@hotzst。感谢您提供问题的链接。当然,它看起来是相关的,因为错误消息是相似的。阅读您的答案后,我不清楚您为解决问题所做的工作。你能建议我如何应用你所做的来解决这个问题吗?
-
第一步是确定问题出在可执行 jar 还是启动器。为此,请使用
java -jar ...执行 jar 文件。如果是启动器,则可能与配置有关。在我的情况下,无法解析 cfg 文件,因为它是根据包含.的应用程序名称计算得出的。 Linux 可执行文件不需要特定的文件后缀即可执行,而 Windows 则需要。 -
这似乎不太可能是可执行 jar 的问题,因为使用
sed命令(见上文)编辑.cfg文件可以使程序运行。任何想法如何修复配置? -
maven 插件有一个针对this issue 的解决方法,因此您可以考虑使用 Maven 而不是 Ant 进行构建,或者弄清楚他们做了什么,然后应用相同的方法。