kay*_*mbi 9 java macos cocoa objective-c
有没有人知道如何将Java运行时嵌入到Mac Cocoa(沙盒)应用程序中,以便应用程序可以运行.jar文件而无需用户单独安装Java?
我们有一个Cocoa应用程序,我们通过Mac App Store以及我们自己的站点销售,可以使用Java来完成特定任务.它是一个编写应用程序,因为.doc,.docx和.odt的标准NSText导出器非常有限(不支持页眉,页脚,图像等),我们写出RTF然后使用基于Java的转换器(来自Aspose. com)将RTF转换为.doc,.docx或.odt,具体取决于所选的导出格式.
我通过使用NSTask调用/ usr/bin/java并运行运行转换例程的捆绑.jar文件来实现此目的.这一切都很好用 - 只要Java安装在用户的Mac上.如果没有安装,我们的应用程序会询问用户是否要安装Java以从增强型转换器中受益,或者反过来使用NSText有损转换器.如果用户选择安装Java,我们调用java_home --request来调用OS X的Java安装程序.
但是,既然Apple已经结束(或即将结束)对Java的直接支持,这种方法就存在问题.在我们上一次Mac App Store审核期间,我们被告知我们很快就会停止询问用户是否要安装Java.我已经读到Apple推荐的路线是将Java Runtime Environment嵌入到需要运行Java的Cocoa应用程序中.(例如:http://lists.apple.com/archives/java-dev/2011/Jul/msg00038.html)
在过去的几天里,我一直在研究如何在我的应用程序中嵌入JRE,但是我没有找到任何关于如何在任何地方执行此操作的说明 - 至少我没理解.几年前有人问过类似的问题:
然而,那里和我发现的其他网站上的答案都是关于将Java应用程序捆绑为Mac应用程序,而不是将JRE与现有的Cocoa应用程序包含在一起.(虽然我接受我缺乏Java经验可能意味着我只是不明白如何为我的目的转换指令 - 带我离开Xcode并且我不在我的舒适区.)同样:https:/ /wikis.oracle.com/display/OpenJDK/How+to+embed+a+.jre+bundle+in+your+Mac+app
似乎有几个应用程序已经这样做了(例如Cyberduck),但还没有人记录过这个过程.从我读过的内容来看,我认为我需要从Oracle的JDK或OpenJDK中获取Java虚拟机并将其包含在我的Cocoa应用程序中并从中调用java,但如果我这样做,那么副本中的Java可执行文件JVM不会被沙盒化,因此我的应用程序无法通过MAS审核流程.所以我可能需要以某种方式构建JDK和沙箱的副本,最有可能作为我的大型Xcode项目的一部分?我甚至不确定从哪里开始; 我猜它还处于早期阶段,并没有多少Mac开发人员必须这样做.
有没有人有过将JRE嵌入到Cocoa应用程序中的经验,应用程序只能使用NSTask调用它?并且以这种方式使JRE完全沙箱化并因此被Mac App Store接受?或者,是否有人成功创建了一个运行.jar文件的沙盒Cocoa应用程序,而无需单独的Java安装?如果是这样,你愿意分享你是如何做到的吗?
(我向Apple发起了一个开发者技术支持事件,请求帮助,但有人告诉他们,鉴于Java现在被认为是第三方开发环境,他们根本无法帮助.)
非常感谢您对我可能错过的网页的任何建议或指示.
我不确定,但我强烈怀疑,当苹果工程师说他们建议“嵌入”Java 运行时时,他的意思并不是“将一个单独的可执行文件捆绑到您的应用程序包中并在单独的进程中运行它”他的意思是“在您自己的进程中启动一个 Java VM,并在该 VM 中运行您需要的内容”。这样做可能比在单独的进程中运行 Java 更麻烦,但这是可能的。
看看班级吧NSJavaVirtualMachine。如果用户没有安装 Java,它可能对您没有帮助,但想法是一样的 - 您只需为自己构建一个包含 Java 运行时的库,将其链接到您的主二进制文件,然后使用JNI API。谷歌对于JNI_CreateJavaVM.
我在另一个问题( Calling a Java class function from Cocoa with JNI )中给出了一个假脱机 JVM 并使用 JNI 调用 Java 的简单示例,尽管这是基于使用 Apple 捆绑的 JavaVM.framework,所以它并不包括构建您需要链接的库的步骤。不幸的是,我对此没有任何经验。