如何压缩Mac应用程序并保留所有属性

3
我已经使用JavaFX在Mac上创建了一个应用程序。我正在使用ant来构建并将该应用程序压缩到一个文件夹中。
尝试使用以下命令进行压缩:
<zip destfile="MyApp.zip" basedir="MyApp"/>

它创建了一个zip文件,但未保留JavaAppLauncher的属性,该文件位于MyApp/Contents.MacOS/目录下。

然后我尝试了这个命令-

<exec executable="zip" dir="${basedir}/target">
  <arg value="-r" />
  <arg value="My-app.zip" />
  <arg value="My.app" />
</exec>

在解压缩这个zip文件后,我发现这个应用程序也无法启动。现在JavaAppLauncher的属性是保留的,但这次我面临着无法保留libjli.dylib(它是一个别名),它位于MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS中,将其转换为动态库的问题。
可能还有一些其他文件在压缩时无法保留它们的属性。那么如何保留所有添加到应用程序内部的库、Unix文件、别名等的属性,以便我在解压缩后可以成功启动它。
谢谢。

我认为大多数开发人员使用磁盘映像来解决这个问题,虽然也不是不能做到。 - demure
1个回答

4
在我的系统上,libjli.dylib 至少是一个类Unix风格的符号链接,而不是 Mac 的“别名”。如果是这种情况,您应该能够在zip命令中添加 -y选项以保留符号链接。
<exec executable="zip" dir="${basedir}/target">
  <arg value="-r" />
  <arg value="-y" />
  <arg value="My-app.zip" />
  <arg value="My.app" />
</exec>

如果这是一个MAC系统中的别名而不是符号链接,您可以尝试使用ditto来创建zip文件,该工具可以以与Finder的“创建归档”选项相同的__MACOSX格式保留资源分支和HFS元数据。为了正确地提取此类zip文件,用户必须在Finder中双击它(或使用ditto提取),而不能使用unzip
<exec executable="ditto" dir="${basedir}/target">
  <arg value="-c" />
  <arg value="-k" />
  <arg value="--keepParent" />
  <arg value="--sequesterRsrc" />
  <arg value="My.app" />
  <arg value="My-app.zip" />
</exec>

或者,正如评论中demure所建议的那样,创建一个压缩的磁盘映像,这是Mac用户期望其应用程序分发的常规方式。
<exec executable="hdiutil">
  <arg value="create" />
  <arg value="-srcfolder" />
  <arg file="${basedir}/target" />
  <arg value="-volname" />
  <arg value="My App" />
  <arg file="MyApp.dmg" />
</exec>

这将把 target 的整个内容打包到图像中,因此您可能需要略微更改一些路径,以便 My.app srcfolder 中唯一的内容(例如,在 target / appbundle / My.app 创建它,然后将 target / appbundle 作为 hdiutil -srcfolder 参数传递)。

谢谢您的回复,正如我所说,我们正在使用JavaFX部署我们的应用程序,因此它默认为我的应用程序创建app和dmg(抱歉,我忘了提到dmg),因此我们不需要为此创建dmg。我们只需要压缩app。根据您的建议,我尝试使用-y选项,但它无法保留libjli.dylib的属性(在zip之前其类型为Alias),将其转换为动态库。 - Neelam Sharma
@NeelamSharma,我不清楚为什么你需要应用程序的 dmg 和 zip 文件,但是我使用 "ditto" 工具添加了另一种可能性。 - Ian Roberts
谢谢你的帮助,我已经尝试使用<arg value="-y" />,这对我很有效 :) 之前我试图将应用程序复制到根目录,但没有成功。非常感谢 :) - Neelam Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接