在Mac OS X中为Swing应用程序嵌入JRE

6
我需要在Swing应用程序中嵌入JRE并进行部署。对于Windows和Linux系统,将应用程序、JRE和.bat/.sh文件压缩成一个zip文件可以解决问题。用户下载zip文件,解压缩并启动应用程序。完美!但是现在,我需要为Mac OS X提供同样的功能。我已经阅读或被告知了许多有关此事的不同内容(在Mac上禁止分发JRE,相反,Mac上始终存在JRE等),因此我非常困惑我是否能够这样做。请问有人已经实现了这样的功能吗?您如何解决Mac应用程序的部署问题?另外,什么是在Mac上分发我的应用程序的最佳格式(zip?)?

2
你尝试过Excelsior JET吗? - user1874520
1
Launch4j怎么样?并且查看这个链接:http://stackoverflow.com/questions/9761518/macos-executable-of-a-jar-file - Nikolay Kuznetsov
@NikolayKuznetsov Launch4J仅用于构建Windows .exe启动器。启动器的“构建”可以在Mac/Linux上完成,但生成的启动器只能在Windows上运行。 - Ian Roberts
3个回答

3
请查看java.net上的appbundler项目。它提供了一个Ant任务,可以将您的应用程序打包成一个普通的Mac .app捆绑包,并可以选择包含一个嵌入式JRE。
目前,在Mac上整个Java领域有点混乱,因为我们仍处于过渡期,即Java 6版本由苹果供应和维护,而Java 7版本直接来自Oracle。a_horse_with_no_name所提到的jarbundler项目是将一个JAR打包成一个.app捆绑包,可以在Mac OS X 10.5/6/7中包含的Apple Java 6上运行,但不能在Oracle Java 7上运行,相反,appbundler针对的是Oracle Java 7,其.app捆绑包不能在Java 6上运行。
如果你想针对运行10.7或10.8的最新Mac,特别是如果你想通过Mac应用商店分发你的应用程序,那么你应该使用appbundler并捆绑JRE的副本。如果你不想通过商店分发,则嵌入式JRE是可选的。如果你的应用可以在Java 6上运行,那么使用jarbundler以针对Apple Java 6意味着你的应用可以运行在旧的(<= 10.6)Mac上。但是,随后任何只有Java 7的更高版本Mac的用户在尝试运行您的应用程序时将被提示下载和安装Java 6。

将.app以.zip存档格式分发是可以的,只要在zip文件内的Contents/MacOS目录中的所有内容(以及适用时在嵌入式JRE中的适当文件)都标记为可执行权限即可。如果使用Ant进行构建,则需要使用具有正确filemode的zipfileset。


jarbundler 针对哪个 Java 版本只取决于所包含的 Stub,如果我没记错的话。因此,如果能够获得 Java7 的 Stub,则可以将其用于 jarbundler。我曾经在从 Java5 升级到 Java6 时这样做过(显然是在其他 Mac 用户的帮助下)。ZIP 文件不起作用,因为您无法在 ZIP 文件中指定执行权限,只能在 tar 文件中指定。 - user330315
1
@a_horse_with_no_name,没有适用于苹果Java使用的“Info.plist”格式兼容的Java 7存根,Oracle版本使用不同的API从存根启动VM。ZIP文件确实可以保存权限信息(技术上它是infozip扩展而不是核心规范的一部分,但它已成为事实上的标准)。 - Ian Roberts
啊,我不知道Stub的那个。但是我从来没有见过一个包含文件权限的ZIP文件(而且我认为Ant的zip任务根本不支持它)。你能给我一个参考吗? - user330315
1
@a_horse_with_no_name "从Ant 1.5.2开始,<zip>可以在存档中存储Unix权限(请参阅<zipfileset>的filemode和dirmode属性的描述)。不幸的是,没有一种可移植的方法来存储这些权限。Ant使用了Info-Zip实现的zip和unzip命令的算法 - 这些是许多Unix和类Unix系统的默认版本的zip和unzip。"(来自Ant手册的<zip>部分 - Ian Roberts

2
“最简单”的方法使用与任何其他平台相同的JAR,通过Java Web Start部署。 我从来没有尝试过将其用于安装JRE。
为了提供更加Mac友好的体验,“最佳”方法要求您将您的JAR包装在应用程序包中,该应用程序包在文章引用的这里中讨论。首选的交付格式是压缩的磁盘映像 .dmg 。
文章{{link4:《Mac OS X的Java部署选项》}}比较了两个选项。 这个游戏是一个可以以任何一种方式启动的例子。
附录:对于好奇的人来说,Mac OS X Finder 将 .jnlp文件视为文档,并默认使用 JWS 启动器打开。 我将一些经常使用的 .jnlp 文件保存在码头文件夹中,以快速访问。 Java 首选项控制面板允许管理缓存的应用程序。选择安装快捷方式会在目标文件夹中创建一个简单的 Mac 应用程序包,其中包括可像其他任何文件一样编辑的 Info.plist。自定义 .plist 的决定取决于应用程序需要的功能:屏幕菜单栏、码头名称和图标、JNI 路径等。

这个关于OS X应用程序包的比较列表是否完全正确?另一方面,1)a)JWS桌面快捷方式不起作用吗?b)JWS应用程序是否出现在OS X相当于Windows“添加/删除程序”小程序中?2)不可能吗?3)图标!别闹了。4)没有异议。5)文档类型可以通过在JNLP中指定兴趣来使用。因此,在该列表中有几个可疑的陈述和一个或两个非常可疑的陈述。希望进一步澄清。 - Andrew Thompson
1
@AndrewThompson:我试图详细阐述我对上述1) a和b的理解(最近获得)。我将需要更仔细地研究2)到5)。 - trashgod

1

我认为你可以安全地假设JRE已经存在于Mac上。

据说最好的格式是一个"App"捆绑包的tar.gz(以保留文件属性)。您可以使用"jarbundler"(http://sourceforge.net/projects/jarbundler/)来创建一个适当的Mac“bundle”,无需进一步提取。请确保在Ant tar任务内将捆绑包中包含的Stub标记为“可执行”。

如果安装了多个JRE,则可能会出现一些问题。在这种情况下,必须使用正确的Stub启动应用程序所需的JRE版本。如果我没记错的话,这个Stub位于/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub

有一页表明Java7和jarbundler可能会出现问题: http://informagen.com/JarBundler/


“我必须使用嵌入式JRE发布Swing应用程序”可能意味着对已安装内容的任何假设都是无效的。 - OrangeDog
@OrangeDog:但是OP也说了:“所以我真的很困惑,不知道我可能做什么”。 - user330315
1
@a_horse_with_no_name 你不能安全地假设Mac上始终存在JRE。正如你现在在10.8.2上看到的那样,随着苹果公司最近的Java更新,它们完全淡出了提供Java 6系统包的过程。 - Uwe Günther

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