我想我找到了解决办法。目前唯一能想到的。我们基本上需要使用自定义应用程序启动器包装 JNLP,签署应用程序,确保我们可以在服务器上动态修改 JNLP,然后让它运行。
您可能知道,有一个 app bundler 项目可以将任何 JAR 文件打包到 OSX 可执行文件中。这可以签名、交付并且不会使 Gatekeeper 失败。我制作了一个自定义 fork(用于拉入主 fork),它可以获取一个 JNLP 文件,将其包装起来,您就有一个自定义应用程序可以完成 JNLP 应该做的所有事情。
但是,要求是您确实拥有有效的“开发者 ID 申请”证书
- 前往bitbucket.org并下载当前版本
- 运行 ant 任务并构建 appbundle 包。
- 查看将创建应用程序容器的示例构建脚本的文档。
- 该示例现在不将 JNLP 包含到应用程序中。
- 应用程序签名以某种方式创建,以便以后可以修改 JNLP 文件。
- 该应用程序被放入一个 zip 文件中。这对于下载应用程序很重要,因为它们只是目录
- 创建您的服务器代码。加载ZIP文件,将JNLP文件放入目录
<yourapp>.app/Contents/Java/
- 交付 zip 文件。
现在,如果一切顺利,zip 文件应该会自动解压到下载文件夹中,您应该会看到您的应用程序图标。如果您确实没有弄错,您可以像执行普通应用程序一样执行该应用程序。
我希望这将帮助许多开发人员使用 OSX 修复损坏的 JNLP 行为。
[可修改 JNLP 的更新] 自 OSX 10.9.5 起,您的应用程序必须具有有效的版本 2 签名。这意味着应用程序捆绑器(设置资源列表文件)以前使用的技巧不再起作用。现在所有东西都必须签名,之后几乎不可能更改已签名的应用程序。
但是我确实找到了一种方法:使用应用程序捆绑器。将 JNLP 设置为目录内的Contents/_CodeSignature文件。不要在其中复制您的可修改 JNLP,而是在稍后修补 zip 时执行此操作(例如,您将需要一些代码)。
请注意:只有当您必须将另一个 JNLP 文件动态放入应用程序容器中时才需要这样做(这就是问题所在)
更新(08-2017)
Oracle 将于 9 月底发布 Java 9。appbundle 没有正确处理 java9 虚拟机。他们改变了很多 API 和 javaws 的工作方式。因为我需要说:如果你想使用打包的 JNLP 应用程序,请坚持使用 java8。