在适用于Mac OS X的Swing应用程序中嵌入JRE

我必须发布带有嵌入式JRE的swing应用程序。 带有application + JRE + .bat / .sh的压缩存档为Windows和Linux提供了技巧。 用户下载zip,解压缩并启动应用程序。 完善。

但是现在,我必须为Mac OS X提供同样的东西。我已经阅读/被告知了很多不同的事情(禁止在Mac上发布JRE,相反,Mac上总是有JRE等等。 ..),所以我真的很困惑我可以做什么。

有没有人做过这样的事情? 你是如何解决Mac应用程序部署的? 作为奖励,在Mac上分发我的应用程序的最佳格式是什么(zip?)?

看一下java.net上的appbundler项目。 它提供了一个Ant任务,它将您的应用程序打包为普通的Mac .app软件包,并且可以选择包含嵌入式JRE。

Mac上的整个Java环境目前有点混乱,因为我们仍处于过渡时期,Apple 6提供并维护Java 6版本,Java 7版本直接来自Oracle。 a_horse_with_no_name引用的jarbundler项目用于将JAR封装为.app捆绑包,该捆绑包将在Apple提供的Java 6上运行,该Java 6包含在Mac OS X 10.5 / 6/7中,但不在Oracle Java 7上运行,相反,appbundler目标Oracle Java 7及其.app包不能在Java 6上运行。

如果你想定位运行10.7或10.8的最新Mac,特别是如果你想通过Mac App Store分发你的应用程序,那么你应该使用appbundler并捆绑一份JRE。 如果您不想通过商店分发,那么嵌入式JRE是可选的。 如果您的应用程序可以在Java 6上运行,那么使用jarbundler定位Apple Java 6将意味着您的应用程序可以在较旧的(<= 10.6)Mac上运行。 但是,当他们尝试运行您的应用程序时,任何拥有最新Mac但只有Java 7的人都会被提示下载并安装Java 6。

只要.app内的所有Contents/MacOS目录(以及嵌入式JRE中的相应文件,如果适用)都在zip文件中标记了执行权限,就可以将.app分发到.zip存档中。 如果您使用Ant构建,则需要使用带有正确文件filemode

最简单的方法使用与通过Java Web Start部署的任何其他平台相同的JAR。 我从未尝试过使用它来安装JRE。

提供更多Mac友好体验的最佳方法要求您将JAR包装在应用程序包中,这在本文引用的文章中有所讨论。 首选的传递格式是压缩磁盘映像 .dmg

Mac OS X的Java部署选项一文比较了这两个选项。 这个游戏是一个可以以任何方式启动的示例。

附录:对于好奇,Mac OS X Finder将.jnlp文件视为文档,默认情况下使用JWS启动程序打开。 我在dock文件夹中保留了一些常用的.jnlp文件的文件夹,以便快速访问。 Java Preferences控制面板允许管理缓存的应用程序。 选择安装快捷方式会在目标文件夹中创建一个简单的Mac应用程序包,并且可以像编辑其他任何内容一样编辑包含的Info.plist 。 自定义.plist的决定取决于应用程序所需的function:屏幕菜单栏,停靠栏名称和图标,JNI路径等。

我认为您可以放心地假设JRE已经存在于Mac上。

最好的格式(所以我被告知 – 我自己不是Mac用户)是“App”包的tar.gz (保存文件属性)。

你可以使用“jarbundler”( http://sourceforge.net/projects/jarbundler/ )创建一个适当的Mac“捆绑”,可以毫不费力地提取。 确保捆绑包中包含的Stub在Ant tar任务中标记为“可执行”。

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

有一个页面表明Java7和jarbundler可能存在问题: http ://informagen.com/JarBundler/