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

时间:2013-01-23 14:59:21

标签: macos swing java

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

但是现在,我必须为Mac OS X提供相同的功能。我已经阅读/被告知有很多不同的事情(禁止在Mac上发布JRE,相反,Mac上总有一个JRE等等...),所以我对我可能做的事情感到困惑。

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

3 个答案:

答案 0 :(得分:3)

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

Mac上的整个Java版本目前有点混乱,因为我们仍然处于过渡时期,Apple 6提供并维护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 App Store分发你的应用程序,那么你应该使用appbundler并捆绑一份JRE。如果您不想通过商店分发,那么嵌入式JRE是可选的。如果您的应用程序可以在Java 6上运行,那么使用jarbundler定位Apple Java 6将意味着您的应用程序可以在较旧的(< = 10.6)Mac上运行。但是,当他们尝试运行你的应用程序时,任何拥有最新Mac但只有Java 7的人都会被提示下载并安装Java 6。

.app分发到.zip存档中是很好的,只要应用程序内的Contents/MacOS目录中的所有内容(以及嵌入式JRE中的相应文件,如果适用)都是在zip文件中标有执行权限。如果您使用Ant进行构建,则需要使用<zipfileset>filemode

答案 1 :(得分:2)

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

提供更多Mac友好体验的最佳方法要求您将JAR包装在应用程序包中,在文章引用的here中进行了讨论。首选投放格式为压缩disk image.dmg

文章Java Deployment Options for Mac OS X比较了两种选择。这个game是一个可以以任何方式启动的示例。

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

答案 2 :(得分:1)

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

最佳格式(我告诉我 - 我自己不是Mac用户)是“App”包的tar.gz(保留文件属性)。

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

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

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