适用于不带JRE的Mac的JavaFX自包含应用程序包



我有一个JavaFX 8桌面应用程序,我正在创建一个.app应用程序捆绑包,将该应用程序分发给Mac用户。为了减小大小,我创建了一个不包含JRE的捆绑包(用户必须已经安装了Java才能使用生成的捆绑包)。

我的构建是一个Gradle脚本,但由于Oracle的"Self-Contained Application Packaging"工具可以与Ant一起使用,我对Ant脚本进行了如下调用:

ant.importBuild 'mac-bundle-ant.xml'

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:application id="VocabHunterId"
                        name="VocabHunter"
                        mainClass="io.github.vocabhunter.gui.distribution.PackagedVocabHunter"/>
        <fx:resources id="applicationResourcesId">
            <fx:fileset dir="${basedir}/build/libs"/>
        </fx:resources>
        <fx:deploy outdir="${basedir}/build"
                   nativeBundles="image">
            <fx:platform basedir=""/>
            <fx:application refId="VocabHunterId"/>
            <fx:resources refid="applicationResourcesId"/>
            <fx:info title="VocabHunter">
                <fx:association description="VocabHunter session"
                                extension="wordy"
                                mimetype="application/x-vnd.VocabHunterSession"
                                icon="${basedir}/icons/mac/VocabHunterSession.icns"/>
            </fx:info>
            <fx:bundleArgument arg="icon"
                               value="${basedir}/icons/mac/VocabHunter.icns"/>
        </fx:deploy>
    </target>
</project>

问题是生成的.app捆绑包不起作用。向内看,我在Contents/Java/VocabHunter.cfg中发现了以下有问题的行:

app.runtime=$APPDIR/PlugIns/Java.runtime

如果我去掉这条线,那么.app束就可以按预期工作。目前,我已经在Gradle脚本中添加了以下破解方法来解决这个问题:

jfxbundle.doLast {
    FileTree tree = fileTree(dir: 'build/bundles').include('**/*.cfg')
    tree.each {File file ->
        String content = file.text.replaceAll('(?m)^app\.runtime=.*$n', '')
        file.write(content)
    }
}

你可以在这里看到完整的代码。

有人知道如何修复Ant脚本,从而避免在Gradle文件中进行黑客攻击吗?

出于完整性的考虑,我使用的是适用于Mac的Oracle JDK 1.8.0_66。

这个bug从java 1.8.0更新60开始存在,我已经报告过了,但它还不是官方的bug。

问题是内部打包程序现在使用INI文件格式,你可以在这里看到我的发现。

您应该能够使用值"prop"设置捆绑包参数"launcher cfg format"(如这里所示)

免责声明:我是javafx-maven插件的维护者。。。并且不要使用gradle,但就我所见,应该添加这个:

        <fx:bundleArgument arg="launcher-cfg-format" value="prop"/>

相关内容

  • 没有找到相关文章

最新更新