【问题标题】:Bundle a Java 7 .jar for Mac为 Mac 捆绑 Java 7 .jar
【发布时间】:2012-08-19 14:57:39
【问题描述】:

我创建了一个需要 Java 7 的 .jar。我有 Java 7(JDK 和 JRE),我可以双击运行 .jar。但是,我想将其打包到应用程序中。

我尝试了什么:使用Apple的Jar Bundler工具,我成功创建了一个应用程序;但是,当我运行它时,它会迅速出现并消失在 Dock 中。当我从终端运行内部文件JavaApplicationStub 时,我得到:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/lcmmun/kiosk/gui/Kiosk : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at apple.launcher.LaunchRunner.loadMainMethod(LaunchRunner.java:56)
    at apple.launcher.LaunchRunner.run(LaunchRunner.java:112)
    at apple.launcher.LaunchRunner.callMain(LaunchRunner.java:51)
    at apple.launcher.JavaApplicationLauncher.launch(JavaApplicationLauncher.java:52)

根据“unsupportedclassversionerror unsupported major.minor version 51.0 unable to load class”,这意味着我没有安装 Java 7。但我愿意。

所以我的假设是 JavaApplicationStub 与 Java 7 不兼容。

我也听说过an ANT task也能完成同样的任务,不过好像太复杂了,不知道怎么用ANT。不过,如果这真的是解决方案,我很乐意学习。

编辑:我现在也尝试了 Eclipse 的 Export > Other > Mac OS Application Bundle。这也失败了。

我正在运行 10.8 Mountain Lion,64 位。

【问题讨论】:

  • “我创建了一个需要 Java 7 的 .jar” 它使用了哪些 Java 7 功能? “我想将它打包到一个应用程序中。” 为什么不使用Java Web Start 部署它?
  • @AndrewThompson:Java Web Start - 很有趣。我需要重写很多代码吗?我有文件加载/保存和Desktop.open,还有大量的 Swing 代码。
  • 要将常用 API 用于文件 I/O 或使用 Desktop,代码需要由您进行数字签名并得到最终用户的信任(出现提示时单击“确定”) .这将需要对代码进行 0 次更改。有些 API 仅适用于应用程序。由 JWS 推出,它们为沙盒应用提供了一种略有不同且更有限的 file I/Odesktop 形式。但要使用这些 API,需要更改代码。
  • 听起来不错。我假设支持 Preferences API (java.util.prefs)?
  • 受信任的应用程序支持所有 J2SE 类。使用 JWS 启动。

标签: java macos package bundle


【解决方案1】:

问题

您的假设绝对正确,Apples JavaApplicationStub 位于此处:

  • System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub

仅与 Apple 为 Mac OS X 构建的 Java 包兼容。

原因

Apple 将停止使用他们自己的 Java System Packages,并且仅在其淡出过程中支持 Java 6。 Oracle 现在接管并从 10.7.3 开始为 Mac OS X 提供 Java 7。正如您在这篇文章中看到的那样,Apple 甚至会在没有任何通知的情况下停止使用像 Jar Bundler.app 这样的开发人员工具:

有些人甚至拼命尝试手动增加 Info.plist 中的 JVMVersion 属性值(由 Apples JavaApplicationStub 读取),从已记录的文字 1.61.6+ 到未记录的文字,如 1.7。这也不起作用,即使您已经安装了 Oracles Java 7 包,您最终也会看到这样的对话框。

因此,您可能会发现退役的 Apple Java 6 世界和未来的 Oracle Java 7 世界之间存在其他不一致之处。

解决方案

要构建基于 Oracles Java 7 的应用程序包,您需要使用包含 Oracles JavaAppLauncher 的 Oracles AppBundler Ant 任务。这个现在只支持 Mac OS X 的 Oracles Java 7,并且不向后兼容 Apple 自己的 Java 系统包。

现在好消息是,您可以将 Oracles Java 7 JRE 内联到您的应用程序包中。它将包含在目录中

  • Contents/PlugIns

在应用程序包中,例如

  • Contents/PlugIns/jdk1.7.0_17.jdk

这意味着您的应用程序包是完全独立的,可用于 App Store 部署。

但您不必这样做。您还可以依赖已安装的 Oracle Java 7 软件包。

如需更详细的答案,您还应该查看:

【讨论】:

  • 所以没有办法让应用程序在我的 jarfile 上运行java -jar?有什么方法可以将一个简单的 bash 脚本嵌入为我的应用程序的可执行文件?像this 这样的东西可以很好地完成工作;那么我就不必担心JDK提供者等了。
  • 当然有,但这里的问题是关于如何以 Apple 方式启动 Java 应用程序,也称为 OSX App-Bundles。因此,您可以使用集成在 OSX 应用程序包中的存根来代替使用“java”二进制文件来启动 Java 主类。
  • 那么“将 Java 7 jar 文件打包到本机 Mac 应用程序中的最简单、最便携的方法是什么”这个问题应该是一个单独的问题吗?
  • 大家好,感谢您的提问和回答,因为答案可以追溯到 2013 年,您有没有找到更好的解决方案来为 mac 捆绑 java 应用程序?
  • @Jack 你认为这个解决方案有什么不足吗?
猜你喜欢
  • 2012-05-29
  • 2015-03-28
  • 2012-06-29
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2012-10-04
相关资源
最近更新 更多