2013-01-23 65 views
6

我必须发布带有嵌入式JRE的swing应用程序。使用应用程序+ JRE + .bat/.sh的压缩归档为Windows和Linux做了诀窍。用户下载zip文件,解压缩并启动应用程序。完善。将JRE嵌入到Mac OS X的Swing应用程序中

但是现在我必须为Mac OS X提供同样的东西。我已经读过/被告知过很多不同的事情(禁止在Mac上分发JRE,相反,总有JRE在Mac等),所以我对我可能做的事情感到非常困惑。

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

+2

您是否试过[Excelsior JET](http://www.excelsior-usa.com /jet.html)? – 2013-01-23 15:20:25

+1

Launch4j怎么样?并检查[this](http://stackoverflow.com/questions/9761518/macos-executable-of-a-jar-file) –

+0

@NikolayKuznetsov Launch4J仅用于构建Windows'.exe'发射器。启动程序的_building_可以在Mac/Linux上完成,但生成的启动程序只能在Windows上运行。 –

回答

1

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

最好的格式(所以我被告知 - 我不是Mac用户本人)是一个tar.gz(保留文件属性)的“应用程序”包。

您可以使用“jarbundler”(http://sourceforge.net/projects/jarbundler/)创建一个合适的Mac“捆绑包”,该捆绑包可以不需要进一步提取。确保Ant tar任务中捆绑包中包含的存根已标记为“可执行”。

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

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

+0

“我必须*通过嵌入式jre *发送一个swing应用程序*”可能意味着对已安装的内容的任何假设都是毫无价值的。 – OrangeDog

+0

@OrangeDog:但是OP也声明:“*所以我对我可能做的事情非常困惑*” –

+1

@a_horse_with_no_name你不能安全地假设一个JRE总是存在于Mac上。正如您现在在10.8.2上看到来自Apple的最新Java更新一样,它们完全从提供Java 6 System包的过程中消失。 –

3

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

由于我们仍然处于Java 6版本由Apple提供和维护并且Java 7版本直接来自Oracle的过渡时期,因此Mac上的整个Java环境目前有点混乱。 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上运行。但是,那些只有Java 7的最新版Mac的用户在尝试运行应用程序时会被提示下载并安装Java 6。

它的优良的.zip存档分发.app,只要在Contents/MacOS目录(在嵌入式JRE相应的文件,如果适用)的应用程序内的一切标有zip文件的执行权限。如果您使用Ant构建,则需要使用<zipfileset> s,并使用filemode

+0

如果我没有弄错,那么使用'jarbundler'来定位哪个Java版本只是包含了Stub的一个问题。所以如果能够得到Java7的Stub,那么也可以用于jarbundler。我这样做是为了从Java5升级到Java6(显然是在其他Mac用户的帮助下)。 ZIP文件将不起作用,因为您无法在ZIP文件中指定执行权限,只能在tar文件中指定。 –

+1

@a_horse_with_no_name Java 7没有存储与Java EE使用的Info.plist格式兼容的存根,Oracle版本使用不同的API从存根中启动VM。一个ZIP文件_can_拥有权限信息(从技术上说,它是一个infozip扩展,而不是核心规范的一部分,但它是一个事实上的标准)。 –

+0

啊,我不知道那个存根。但我从来没有见过一个包含文件权限的ZIP文件(我认为Ant的zip任务根本不支持它)。你能给我一个参考吗? –

2

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

best提供Mac友好体验的方法要求您将JAR包装在应用程序包中,在文章的引用here中进行了讨论。优选的递送格式是压缩的disk image.dmg

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

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

+0

该比较列表完全正确的OS X应用程序包? OTOH 1)a)不要JWS桌面快捷方式工作? b)不要使用JWS应用程序。出现在Windows的“添加/删除程序”小程序的OS X等价物中? 2)这不可能吗? 3)图标!给我休息一下。4)没有理由。 5)通过指定对JNLP的兴趣可以获得文档类型。因此,在这份名单中有几个可疑的,一两个真正令人怀疑的陈述。进一步的澄清,将不胜感激 –

+1

@AndrewThompson:我试图阐述我的(最近获得的)对1)a和b的理解。我将不得不在2)到5)更近一点。 – trashgod

相关问题