没有JRE的JavaFX-DEB包不';行不通

没有JRE的JavaFX-DEB包不';行不通,java,linux,javafx,deb,Java,Linux,Javafx,Deb,我正在使用Oracle“自包含应用程序打包”工具为JavaFX8桌面应用程序制作一个.deb文件。生成的包文件可以在Ubuntu上顺利安装,但应用程序无法运行。该文件的安装方式如下: $ sudo dpkg -i vocabhunter-1.0.14.deb <project name="VocabHunter Packaging" basedir="" xmlns:fx="javafx:com.sun.javafx.tools.ant"> <pro

我正在使用Oracle“自包含应用程序打包”工具为JavaFX8桌面应用程序制作一个
.deb
文件。生成的包文件可以在Ubuntu上顺利安装,但应用程序无法运行。该文件的安装方式如下:

$ sudo dpkg -i vocabhunter-1.0.14.deb
<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>
但是,尝试运行应用程序会产生以下错误:

$ /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脚本如下所示:

$ sudo dpkg -i vocabhunter-1.0.14.deb
<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>

您可以在上下文中看到完整的脚本


我正在Ubuntu 14.04上使用JDK 1.8.0_92测试这个问题。

要回答这个问题,您需要设置
JRE_HOME
以运行一些本机JavaFX启动器,而不必捆绑JRE。在Windows上,它查看注册表并搜索
HKLM\Software\JavaSoft\Java运行时环境\[CurrentVersion]\JavaHome
我找不到任何有关此的文档。

要解决此问题,您需要“更新”安装时执行的
app.runtime
-脚本中的
postinst
-值。大概是这样的:

#!/bin/sh
# postinst script for APPLICATION_NAME
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <postinst> `configure' <most-recently-configured-version>
#        * <old-postinst> `abort-upgrade' <new version>
#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
#          <new-version>
#        * <postinst> `abort-remove'
#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
#          <failed-install-package> <version> `removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    configure)
        echo Adding shortcut to the menu
SECONDARY_LAUNCHERS_INSTALL
APP_CDS_CACHE
        xdg-desktop-menu install --novendor /opt/APPLICATION_FS_NAME/APPLICATION_LAUNCHER_FILENAME.desktop
FILE_ASSOCIATION_INSTALL

        if [ "SERVICE_HINT" = "true" ]; then
            echo Installing daemon
            cp /opt/APPLICATION_FS_NAME/APPLICATION_PACKAGE.init /etc/init.d/APPLICATION_PACKAGE

            if [ -x "/etc/init.d/APPLICATION_PACKAGE" ]; then
                update-rc.d APPLICATION_PACKAGE defaults

                if [ "START_ON_INSTALL" = "true" ]; then
                    if which invoke-rc.d >/dev/null 2>&1; then
                        invoke-rc.d APPLICATION_PACKAGE start
                    else
                        /etc/init.d/APPLICATION_PACKAGE start
                    fi
                fi
            fi

        fi

        if [ -f /etc/profile ]; then
            # load special environment variables
            . /etc/profile

            # remove stored value in case of dpkg-reconfigure
            RUNTIME_PATH_TO_SET=""

            if [ -z "$JRE_HOME" ]; then
                echo JRE_HOME is not set, checking for JAVA_HOME being set
                if [ -z "$JAVA_HOME" ]; then
                    echo JAVA_HOME is not set, checking for known locations

                    # look for known locations
                    KNOWN_JDK_DIRS="/usr/lib/jvm/java-8-oracle /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-8-openjdk-i386"
                    FOUND_JAVA_HOME=""

                    # Look for the right JVM to use (use the first one)
                    for potentialjdkdir in $KNOWN_JDK_DIRS; do
                        if [ -r "$potentialjdkdir/bin/java" -a -z "$FOUND_JAVA_HOME" ]; then
                            FOUND_JAVA_HOME="$potentialjdkdir"
                        fi
                    done

                    if [ -z "$FOUND_JAVA_HOME" ]; then
                        # still nothing found :(
                        echo Please make sure to have Java installed and JRE_HOME variable set before running APPLICATION_LAUNCHER_FILENAME
                    else
                        echo Updating runtime-settings using known location
                        RUNTIME_PATH_TO_SET="$FOUND_JAVA_HOME"
                    fi
                else
                    echo Updating runtime-settings using JAVA_HOME
                    # JAVA_HOME is set, use that value
                    RUNTIME_PATH_TO_SET="$JAVA_HOME"
                fi
            fi

            # always write runtime-location, as it might get removed again when user calls dpkg-reconfigure
            sed -i "s|app.runtime=.*|app.runtime=$RUNTIME_PATH_TO_SET|g" /opt/APPLICATION_FS_NAME/app/APPLICATION_LAUNCHER_FILENAME.cfg
        fi
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0
#/垃圾箱/垃圾箱
#应用程序名称的postinst脚本
#
#见:dh_installdeb(1)
set-e
#如何调用此脚本的摘要:
#*`配置'
#*`中止升级'
#*/dev/null 2>&1;然后
调用rc.d应用程序\u包启动
其他的
/etc/init.d/APPLICATION\u包启动
fi
fi
fi
fi
如果[-f/etc/profile];然后
#加载特殊的环境变量
. /等/简介
#在dpkg重新配置的情况下删除存储值
运行时路径到设置=“”
如果[-z“$JRE_HOME”];然后
未设置echo JRE_主页,正在检查是否设置了JAVA_主页
如果[-z“$JAVA_HOME”];然后
未设置echo JAVA_HOME,正在检查已知位置
#寻找已知的地点
已知的JDK_DIRS=“/usr/lib/jvm/java-8-oracle/usr/lib/jvm/java-8-openjdk-amd64/usr/lib/jvm/java-8-openjdk-i386”
找到_JAVA_HOME=“”
#寻找要使用的正确JVM(使用第一个)
以$KNOWN_JDK_DIRS表示的潜在jdkdir;做
如果[-r“$potentialjdkdir/bin/java”-a-z“$FOUND\u java\u HOME”];然后
找到_JAVA_HOME=“$potentialjdkdir”
fi
完成
如果[-z“$FOUND_JAVA_HOME”];然后
#仍然没有找到任何东西:(
echo在运行应用程序\u启动器\u文件名之前,请确保安装了Java并设置了JRE\u HOME变量
其他的
使用已知位置回显更新运行时设置
运行时\u路径\u到\u集=“$FOUND\u JAVA\u HOME”
fi
其他的
使用JAVA_HOME更新运行时设置
#JAVA_主页已设置,请使用该值
运行时\u路径\u到\u集=“$JAVA\u HOME”
fi
fi
#始终写入运行时位置,因为当用户调用dpkg reconfigure时,它可能会再次被删除
sed-i“s|app.runtime=.*app.runtime=$runtime_PATH_TO_SET|g”/opt/APPLICATION_FS_NAME/app/APPLICATION_LAUNCHER_FILENAME.cfg
fi
;;
中止升级|中止删除|中止取消配置)
;;
*)
echo“使用未知参数\`1'”调用postinst>&2
出口1
;;
以撒
#dh_installdeb将自动用shell代码替换此代码
#由其他debhelper脚本生成。
#去骨助手#
出口0
使用javafx maven插件或javafx gradle插件时,将此脚本放入
src/main/deploy/package/linux
中,文件名为
postinst
,以便javapackager/bundler获取

免责声明:我是的维护者和的创建者


编辑:更新了用于
dpkg重新配置的脚本
too

这可能与中的相同。还可以查看两个bug报告和。后者应使用8u76.Hi@hotzst解决。谢谢你给我这个问题的链接。当然,它看起来是相关的,因为错误消息是相似的。读了你的答案后,我不清楚你是怎么解决这个问题的。您能建议我如何应用您所做的来解决这个问题吗?第一步是确定问题是与可执行jar还是启动器有关。为此,使用
java-jar…
执行jar文件。如果是启动器,则可能与配置相关。在我的例子中,cfg文件无法解析,因为它是根据应用程序名计算的,其中包含
。Linux可执行文件不需要特定的文件后缀即可执行,Windows则需要。在编辑
.cfg
文件时,可执行jar似乎不太可能出现问题