我在将 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] 请求 [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/Framework/ApplicationServices. /A/应用服务

这很奇怪,因为我对该主题的研究表明 _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楼 票数:2 已采纳

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

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

这个网站描述了如何修改 info.plist 文件,甚至有一个脚本可以为你做这件事。

简而言之,必须进行的更改如下。 文件/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> ...

  ask by nhaggen translate from so

未解决问题?本站智能推荐:

1回复

在 MacOS 上,我可以在 Java 应用程序的 Info.plist 文件中添加默认设置吗

由于MacOS Big Sur 中的错误,我需要运行以下命令 用于我的 Java 应用程序与 Java 的捆绑版本 有没有一种方法可以将它添加到我的Info.plist文件中,以便它已经在新安装中自动设置,我也可以使用Runtime类从 Java 中运行命令,但如果我可以将它配置为Info.pl
1回复

Info.plist的。 如何指定多个可执行文件?

我弄清楚了编写Info.plist文件以打包mac应用程序的一些基础知识。 我遇到了一个令人讨厌的问题。 我有一个jar文件,它是应用程序的主要入口点。 plist文件的CFBundleExecutable设置为启动器。 启动器将打开jar文件。 有2个jar文件。 jar 1由
1回复

将Java应用程序的文档文件封装为OS X上的软件包

我正在从Java应用程序编写特定于应用程序的文档。 这些文件基本上是一个目录中相关文件/数据库的集合。 在OS XI上,希望该目录看起来像一个文档文件一样不透明 ,就像RTFD一样将RTF文本文件以及相关的资源(例如粘贴的图形)隐藏起来。 我了解这个概念称为封装 。 例如,设想以下结
3回复

Swing:从其他应用程序中窃取焦点(OS X中的可用性)

我在java swing有一个应用程序,它在大多数时间都在系统托盘中运行。 用户可以使用“ Tray Menu执行多个操作。 其中一个操作是显示应用程序窗口。 我遇到的问题是OS X上的可用性。 在Windows中 ,如果用户打开应用程序窗口并稍后切换到另一个应用程序,他们可以使用任
1回复

使用JavaStub的不带Java应用程序捆绑的OSX上的文件关联

我有一个不使用Java-Stub的Java应用程序的OSX应用程序捆绑包,而是一个Shellscript(通过Info.plist注册)。 我还在Info.plist中注册了文件扩展名: 这是使LaunchService识别我的文件以及与我的程序的关联所需要的。 据我了解的App
1回复

Java OS X-扩展坞中没有应用程序图标[重复]

可能重复: LSUIElement不起作用 我正在使用Jar Bundler从我的.jar文件中创建一个.app文件。 启动应用程序时,我根本不希望显示停靠图标。 我已经尝试过将.plist文件修改为包括: 但这不起作用...有帮助吗?
2回复

Java $ APP_PACKAGE路径名变量不起作用

根据Mac的Java Info.plist密钥参考 ,您应该能够使用$ APP_PACKAGE变量来访问Mac应用程序捆绑包的根目录。 因此,我认为可以将文件存储在Contents / Resources /文件夹中,并可以通过调用 但是,这似乎不起作用,我只是遇到了找不到文件的错误。
1回复

更改info.plist文件中的版本,以便在Mac finder中显示正确的版本

我正在对其他人创建的应用程序进行维护,因此我想更改Info.plist文件中的版本,以便当有人在查找器中选择该应用程序时将显示正确的版本。 当我手动编辑info.plist文件并将捆绑软件版本字符串从1.0更改为3.0时,它仍在finder中显示1.0。 另外,当我重新编译应用程序时,版本字