Исправьте настройки Info.plist для запуска приложения Java в определенной JVM - PullRequest
0 голосов
/ 12 октября 2018

У меня серьезная проблема при переносе приложения 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. / systemb: / lib/ApplicationServices.framework/Versions/A/ApplicationServices

Что странно, поскольку мои исследования по этой теме говорят о том, что _CTFontCopyDefaultCascadeListForLanguages ​​должен быть доступен в Java8.

Кстати, результатверсии Java:

Java-версия "1.8.0_181"

Java (TM) SE Runtime Environment (сборка 1.8.0_181-b13)

Java HotSpot(TM) 64-разрядная серверная виртуальная машина (сборка 25.181-b13, смешанный режим)

и установлены следующие jdks

1.8.0_181, x86_64: "Java SE 8"/ Библиотека / 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/ Содержание / Главная

Так что я думаю, проблема в том, как ОС запускает приложение.Что я делаю не так?

1 Ответ

0 голосов
/ 16 октября 2018

Нашел решение проблемы.После перехода с Apple java 6 на Oracle java 8 JDK некоторые настройки были потеряны, и система не знает, что JVM может запускать связанные приложения.

Для info.plist самой jvm необходимобыть изменен, чтобы сообщить ОС, что 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> ...
...