更正 Info.plist 设置以在特定 JVM 中启动 Java 应用程序

Correct Info.plist settings to launch Java app in specific JVM

我在将 macos 应用程序从 Java 6 迁移到 Java 8 时遇到严重问题。 由于它部署在 mac 上,该程序使用 com.apple.eawt.ApplicationAdapter,已弃用并替换为 com.apple.eawt.XYHandler

到目前为止一切顺利,我可以从 Eclipse 中启动我的应用程序(编译器合规级别设置为 1.8,JRE 设置为 Java SE 8)。

然后我有一个脚本调用 javac,将编译的 jars 放入 .app 包中,写入 Info.plist 等等。 Java JVMVersion 设置为 1.8+ 。到目前为止,这也有效。

当我尝试启动该应用程序时,它提示没有合适的 Java 1.8+ 版本可用

[JavaAppLauncher] Requested [1.8+], launching in [(null)] instead.

[JavaAppLauncher Error] unable to find a version of Java to launch

我尝试了 JVMVersion 的所有 possible 选项(1.8*、1.8.0_181、1.7+、1.6+),最后一个是唯一启动的。当然后来它崩溃了,因为 Java6 没有实现 XYHandlerApplicationAdapter.

如果我从命令行启动主程序 class,它会启动,但之后会崩溃,原因如下:

dyld: Symbol not found: _CTFontCopyDefaultCascadeListForLanguages Referenced from: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/libawt_lwawt.dylib Expected in: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices

这很奇怪,因为我对该主题的研究表明 _CTFontCopyDefaultCascadeListForLanguages 应该在 Java8 中可用。

对了,java-version的结果是

java version "1.8.0_181"

Java(TM) SE Runtime Environment (build 1.8.0_181-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

安装了以下jdks

1.8.0_181, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

1.8.0_60, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home

1.7.0_80, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

1.6.0_65-b14-468, x86_64: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

1.6.0_65-b14-468, i386: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

所以我猜问题出在 OS 启动应用程序的方式上。我做错了什么?

找到问题的解决方案。由于从 Apple 的 java 6 迁移到 Oracle 的 java 8 JDK,一些设置丢失了,系统不知道,JVM 能够 运行 捆绑应用程序。

需要修改 jvm 本身的 info.plist 以告知 OS,Java 8 JVM 适用于 运行ning 应用程序.

This website describes how to modify the info.plist file 甚至还有一个脚本可以为您完成。

简而言之,必须进行的更改如下。文件 /Library/Java/JavaVirtualMachines/jdk_version_info_goes_here.jdk/Contents/Info.plist 必须从这个

更改
<key>JavaVM</key>
  <dict>
    <key>JVMCapabilities</key>
      <array>
        <string>CommandLine</string>
      </array> ...

至此

<key>JavaVM</key>
  <dict>
    <key>JVMCapabilities</key>
      <array>
        <string>BundledApp</string>
        <string>CommandLine</string>
        <string>JNI</string>
      </array> ...