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

标签 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] Requested [1.8+], launching in [(null)] instead.

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

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

如果我从命令行启动主类,它会启动,但随后会崩溃,因为:

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

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

最佳答案

找到问题的解决方案。自从从 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> ...

关于java - 正确的 Info.plist 设置以在特定 JVM 中启动 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52782711/

相关文章:

java - 找不到 bean 定义,我也应该注释一个接口(interface)吗?

java - Maven父pom : Unable to resolve imported document

macos - 每次升级 Xcode 时,我都会收到 brew installed GCC 的链接器错误

ios - 在 iOS 9 中设置 NSAllowsArbitraryLoads - Apple 会拒绝该应用程序吗?

ios - 从今日扩展中以编程方式从plist获取URL方案

java - spring中sql查询失败如何回滚事务

swift - 获取在 ViewController 类中启动应用程序的文件名?

bash - 在 macOS 上的 Bash shell 脚本中查找当前鼠标坐标

Xcode 无法打开 Info.plist - 错误显示 "there is no such file"

java - 具有共享代码的两个代号一个项目