在应用程序包中包含 JVM 副本

Posted

技术标签:

【中文标题】在应用程序包中包含 JVM 副本【英文标题】:Include copy of JVM in app bundle 【发布时间】:2016-06-24 19:29:14 【问题描述】:

我有一个 OS X Objective-c 应用程序,它以编程方式调用 Java 命令来运行 Java 程序。

如果我是正确的,Java 不再默认安装在 OS X 上。我想发布我的应用程序,而不是强迫用户在使用应用程序之前下载 Java。

如何将 java 可执行文件的副本与运行时 (rt.jar) 一起提供。当然,我可以在应用程序包中复制rt.jar,但是 java 二进制文件呢?我也可以复制一下吗?

【问题讨论】:

【参考方案1】:

我认为在您的情况下,最好的选择是包含 Java 安装程序内核(如果需要,可以下载并安装最新版本的 Java 的小型安装)。

在您的应用程序中捆绑二进制文件本身的主要问题是安全性。在 JRE 中定期发现漏洞并进行修补。如果捆绑特定版本并在发布后发现漏洞,则基本上会削弱安装应用程序的机器的安全性。由于您显然不想这样做,因此最好尝试包含逻辑以检测是否存在兼容版本,或者以其他方式正确安装正确的版本。许多安装程序包包括这样的选项:例如,OpenOffice/LibreOffice 是本机应用程序,但它们需要存在 Java,并且它们使用与上述类似的安装方法。

【讨论】:

顺便说一下,您可以添加一些简单的逻辑来获取 Java 的最新版本号 (java.com/en/download/installed8.jsp),然后下载/安装该版本。 另外,如果钱不是对象,您可以使用以下命令将您的 Java 应用程序变成无 JRE 的可执行文件:excelsiorjet.com。【参考方案2】:

每个独立的应用程序包包括以下项目:

应用程序代码,打包成一组 JAR 文件,以及任何其他应用程序资源(数据文件、本机库)

JRE 的副本,仅供此应用程序使用

应用程序的原生启动器,支持单个包的多个启动器

元数据,例如图标

可以有多种封装格式。为多种类型的软件包提供了内置支持。您还可以通过对打包为文件夹的自包含应用程序进行后处理来组装自己的包,例如,如果您想将应用程序作为 ZIP 文件分发。

--

自包含的应用程序包有以下缺点:

“下载并运行”用户体验

与 Web 部署不同,用户体验不是“从 Web 启动应用程序”。它更像是“下载、安装和运行”过程之一,用户可能需要通过额外的步骤才能启动应用程序。例如,用户可能必须接受浏览器或操作系统安全对话框,或者从下载文件夹中查找并启动应用程序安装程序。

更大的下载大小

通常,自包含应用程序包的大小大于独立应用程序的大小,因为其中包含 JRE 的私有副本。

每个目标平台的包

自包含应用程序包是特定于平台的,只能为您构建的同一系统生成。要在 Windows、Linux 和 OS X 上交付自包含的应用程序包,您必须在所有三个平台上构建您的项目。

应用程序更新是开发者的责任

Web 部署的 Java 应用程序一旦可用,就会自动从 Web 下载应用程序更新。 Java 自动更新机制负责每年将 JRE 更新到最新的安全版本数次。独立的应用程序没有对自动更新的内置支持。

【讨论】:

【参考方案3】:

您可以将 JRE 与您的应用一起发布(请参阅 licensing)。要为用户提供 JRE 的副本,请将其放入并让他们自己安装或 make a application bundle。

【讨论】:

感谢您的回复。请注意,主应用程序是一个 Objective-c 应用程序,它只是在某个时候运行一个 java 命令。应用程序包是纯 Java 应用程序,所以这不是我可以使用的。所以可能复制 'rt.jar' 和 Java 二进制文件(例如 /usr/bin/java)。我可以只复制二进制文件吗?它适用于所有 OSX 版本吗?

以上是关于在应用程序包中包含 JVM 副本的主要内容,如果未能解决你的问题,请参考以下文章

将工作表的副本另存为 CSV,并在保存名称中包含日期

如何在 ScriptBundle for .NET MVC (4.7.2) 应用程序中包含 SRI 哈希?

Java 中包含的 JAX-WS 实现?

在 iOS 应用程序包中包含数据

在 Vue.js 应用程序中包含 npm 包

错误 Itms-90339:此捆绑包无效。 info.plist 在应用程序包中包含无效键“CFBundleResourceSpecification”