我在将 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/