【问题标题】:Embedding a JRE in a Swing application for Mac OS X在 Mac OS X 的 Swing 应用程序中嵌入 JRE
【发布时间】:2013-03-25 18:12:04
【问题描述】:

我必须发布一个带有嵌入式 JRE 的 Swing 应用程序。一个带有应用程序 + JRE + .bat/.sh 的压缩归档文件在 Windows 和 Linux 上起到了作用。用户下载 zip,解压缩,然后启动应用程序。完美。

但是现在,我必须为 Mac OS X 提供相同的东西。我已经阅读/被告知了很多不同的东西(禁止在 Mac 上分发 JRE,相反,Mac 上总是有 JRE ,等等...),所以我真的很困惑我能做什么。

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

【问题讨论】:

  • 你试过Excelsior JET吗?
  • Launch4j 怎么样?并检查this
  • @NikolayKuznetsov Launch4J 仅用于构建 Windows .exe 启动器。启动器的构建可以在 Mac/Linux 上完成,但生成的启动器只能在 Windows 上运行。

标签: macos swing java


【解决方案1】:

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

Mac 上的整个 Java 环境目前有点混乱,因为我们仍处于过渡时期,Java 6 版本由 Apple 提供和维护,Java 7 版本直接来自 Oracle。 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 分发您的应用程序,那么您应该使用 appbundle 并捆绑 JRE 的副本。如果您不想通过商店分发,则嵌入式 JRE 是可选的。如果您的应用程序可以在 Java 6 上运行,那么使用 jarbundler 以 Apple Java 6 为目标将意味着您的应用程序可以在较旧的 (

可以将.app 分发到.zip 存档中,只要应用程序内Contents/MacOS 目录(以及嵌入式JRE 中的相应文件,如果适用)中的所有内容在压缩文件。如果您使用 Ant 构建,则需要使用 <zipfileset>s 和正确的 filemode

【讨论】:

  • jarbundler 所针对的 Java 版本只是包含哪个 Stub 的问题,如果我没记错的话。因此,如果可以获取 Java7 的 Stub,那么它也可以用于 jarbundler。我这样做是为了从 Java5 升级到 Java6(显然是在其他 Mac 用户的帮助下)。 ZIP 文件不起作用,因为您不能在 ZIP 文件中指定执行权限,只能在 tar 文件中指定执行权限。
  • @a_horse_with_no_name Java 7 没有与 Apple Java 使用的 Info.plist 格式兼容的存根,Oracle 版本使用不同的 API 从存根启动 VM。 ZIP 文件可以保存权限信息(从技术上讲,它是一个 infozip 扩展,而不是核心规范的一部分,但它是事实上的标准)。
  • 啊,我不知道存根。但是我从未见过包含文件权限的 ZIP 文件(而且我认为 Ant 的 zip 任务根本不支持它)。你能给我一个参考吗?
  • @a_horse_with_no_name "从 Ant 1.5.2 开始,<zip> 可以在存档中存储 Unix 权限(请参阅<zipfileset> 的 filemode 和 dirmode 属性的描述)。不幸的是,没有可移植的方法来存储这些权限。Ant 使用 Info-Zip 实现 zip 和 unzip 命令所使用的算法——这些是许多 Unix 和类 Unix 系统的默认版本的 zip 和 unzip。 (来自Ant manual for <zip>
【解决方案2】:

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

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

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

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

【讨论】:

  • 该比较列表对于 OS X 应用程序包是否完全正确? OTOH 1) a) JWS 桌面快捷方式不起作用吗? b) 不要使用 JWS 应用程序。出现在相当于 Windows“添加/删除程序”小程序的 OS X 中? 2)不可能吗? 3)图标!让我休息一下.. 4)没有争论。 5) 通过指定对 JNLP 的兴趣可以获得文档类型。因此,该列表中有几个有问题的,以及一两个非常可疑的陈述。进一步澄清将不胜感激
  • @AndrewThompson:我试图详细说明我(最近获得的)对上述 1)a 和 b 的理解。我得仔细看看 2) 到 5)。
【解决方案3】:

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

最好的格式(有人告诉我——我自己不是 Mac 用户)是“App”捆绑包的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/

【讨论】:

  • “我必须发布一个带有嵌入式jre的swing应用程序”可能意味着任何关于已经安装的假设都是毫无价值的。
  • @OrangeDog:但 OP 也表示:“所以我真的很困惑我能做什么
  • @a_horse_with_no_name 您不能安全地假设 Mac 上始终存在 JRE。正如您现在看到的,Apple 最近在 10.8.2 上更新了 Java,它们完全退出了提供 Java 6 系统包的过程。
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多