将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
所以我想问题在于操作系统如何启动应用程序。我在做什么错了?
答案 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> ...