将java运行时嵌入到沙盒的mac应用程序中

kiz8lqtg  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(446)

有人知道如何将java运行时嵌入到MacCocoa(沙盒)应用程序中,这样应用程序就可以运行一个.jar文件,而不需要用户单独安装java吗?
我们有一个cocoa应用程序,我们通过mac应用商店以及我们自己的网站销售,它可以使用java来完成特定的任务。它是一个书写应用程序,由于.doc、.docx和.odt的标准nstext导出程序非常有限(不支持页眉、页脚、图像等),我们将其写出到rtf,然后使用基于java的转换器(来自aspose.com)将rtf转换为.doc、.docx或.odt,具体取决于所选的导出格式。
为此,我使用nstask调用/usr/bin/java并运行一个bundled.jar文件来运行转换例程。只要用户的mac上安装了java,所有这些都能很好地工作。如果没有安装,我们的应用程序会询问用户是否希望安装java以从增强的转换器中获益,或者转而使用nstext有损转换器。如果用户选择安装java,我们将其称为javahome——请求调用OSX的java安装程序。
然而,既然苹果已经(或正在)终止了对java的直接支持,这种方法就有问题了。在我们上次对mac应用商店的回顾中,我们被告知我们很快就需要停止询问用户是否想要安装java。我读到过,苹果推荐的未来路线是将java运行时环境嵌入到需要运行java的cocoa应用程序中(例如:http://lists.apple.com/archives/java-dev/2011/jul/msg00038.html )
因此,在过去的几天里,我一直在研究如何在我的应用程序中嵌入jre,但我没有找到任何关于如何在任何地方嵌入jre的说明——至少我什么都不懂。几年前有人在这里问了一个类似的问题:
在mac os x上捆绑专用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,但是如果我这样做了,jvm副本中的java可执行文件就不会被沙盒化,所以我的应用程序就无法通过mas审查过程。所以我大概需要以某种方式构建jdk的副本并对其进行沙盒处理,很可能是作为我更大的xcode项目的一部分?我甚至不知道从哪里开始;我猜现在还为时尚早,没有多少mac开发者必须这么做。
有没有人有过将jre嵌入cocoa应用程序的经验,这样应用程序就可以使用nstask调用jre?以这样一种方式,jre是完全沙盒的,因此被mac应用商店所接受?或者,有没有人成功地创建了一个沙盒cocoa应用程序,它运行一个.jar文件而不需要单独的java安装?如果是的话,你愿意分享一下你是怎么做到的吗?
(我在一次开发人员技术支持事件中向苹果求助,但被告知他们根本帮不上忙,因为java现在被认为是第三方开发环境。)
非常感谢您对我可能错过的网页的任何建议或提示。

8mmmxcuj

8mmmxcuj1#

要回答关于沙盒和辅助二进制文件的子问题,这不是问题。您只需将二进制文件标记为继承沙盒。
有一个 .entitlements 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.inherit</key>
    <true/>
</dict>
</plist>

并确保在xcode中有一个生成阶段,对aux二进制文件进行编码:

codesign --entitlements myjava.entitlements -s "${CODE_SIGN_IDENTITY}" java
kx1ctssn

kx1ctssn2#

我不能肯定,但我强烈怀疑,当那个苹果工程师说他们建议“嵌入”java运行时,他并不是说“将一个单独的可执行文件捆绑到你的应用程序包中,并在一个单独的进程中运行”,而是说“在你自己的进程中启动一个java虚拟机,并在该虚拟机中运行你需要的东西。”可以说,这样做比在一个单独的进程中运行java更麻烦,但这是可能的。
看一看这个 NSJavaVirtualMachine 班级。如果用户没有安装java,这可能对您没有帮助,但是想法是一样的——您只需构建一个包含java运行时的库,将其链接到主二进制文件中,然后使用JNIAPI创建和管理jvm。谷歌 JNI_CreateJavaVM .
我在另一个问题(用jni调用cocoa中的一个java类函数)中给出了一个快速的例子,这个例子使用了apple绑定的javavm.framework,所以它不包括构建需要链接的库的步骤。不幸的是,我没有这方面的经验。

相关问题