正确的Info.plist设置以在特定JVM中启动Java应用

时间:2018-10-12 15:29:56

标签: java macos info.plist

将macOS应用程序从Java 6迁移到Java 8时遇到严重问题。 由于该程序已部署在Mac上,因此该程序使用的com.apple.eawt.ApplicationAdapter已弃用,并由com.apple.eawt.XYHandler取代。

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

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

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

  

[JavaAppLauncher]请求了[1.8+],而是以[(null)]启动。

     

[JavaAppLauncher错误]无法找到要启动的Java版本

我尝试了JVMVersion的所有可能选项(1.8 *,1.8.0_181、1.7 +,1.6 +),最后一个是唯一启动的版本。当然,稍后它会崩溃,因为Java6不是实现XYHandler,而是实现ApplicationAdapter

如果我从命令行启动主类,它会启动,但由于以下原因它会崩溃:

  

dyld:未找到符号:_CTFontCopyDefaultCascadeListForLanguages     引用自:   /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/libawt_lwawt.dylib预期在:   /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices

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

顺便说一句,java -version的结果是

  

java版本“ 1.8.0_181”

     

Java(TM)SE运行时环境(内部版本1.8.0_181-b13)

     

Java HotSpot(TM)64位服务器VM(内部版本25.181-b13,混合模式)

及以下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

所以我想问题在于操作系统如何启动应用程序。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

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

需要修改jvm本身的info.plist,以告知操作系统Java 8 JVM适合运行该应用程序。

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> ...