更正 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 没有实现 XYHandler
但 ApplicationAdapter
.
如果我从命令行启动主程序 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> ...
我在将 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 没有实现 XYHandler
但 ApplicationAdapter
.
如果我从命令行启动主程序 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> ...