【发布时间】:2016-02-27 04:15:59
【问题描述】:
我有一个 JavaFX 8 桌面应用程序,并且我正在创建一个 .app 应用程序包以将该应用程序分发给 Mac 用户。为了减小大小,我创建了一个不包含 JRE 的包(用户必须已安装 Java 才能使用生成的包)。
我的构建是一个 Gradle 脚本,但由于 Oracle“自包含应用程序打包”工具可与 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 脚本中添加了以下 hack 来解决这个问题:
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)
}
}
你可以看到完整的代码here。
有谁知道如何修复 Ant 脚本,从而避免对 Gradle 文件进行 hack?
为了完整起见,我使用的是适用于 Mac 的 Oracle JDK 1.8.0_66。
【问题讨论】:
标签: macos ant gradle javafx javafx-8