Java - Mac приложение требует, чтобы JDK был установлен для запуска - PullRequest
0 голосов
/ 31 мая 2019

У меня есть приложение Java, которое работает на Mac OS X (в комплекте .app-файл) с двумя файлами Jar внутри.Один Jar запускает другой Jar для передачи некоторых параметров.Я также встроил JRE в приложение, так что пользователю вообще не нужно беспокоиться о загрузке Java.Проблема заключается в том, что когда пользователь запускает приложение, первый Jar работает нормально, используя встроенный JRE, но когда он пытается запустить второй Jar с помощью этого примера кода:

String jarPath = "MyMainJar.jar"
String [] cmd = { "java", "-jar", "-noverify", jarPath };
ProcessBuilder processBuilder = new ProcessBuilder( cmd );
Process process = processBuilder.start();

Следующая ошибка всегда появляется в Mac: Mac Java App requires JDK

И в Терминале это напечатано: Нет времени выполнения Java, запрос на установку.

Если я установлю JDK, все будет работатьпросто отлично, но основная идея здесь в том, что я встроил JRE, чтобы пользователь не беспокоился об этих проблемах Java и об их установке. Итак, мои вопросы:

  • В моем встроенном JRE есть инструмент "java" в папке "bin".Почему первый кувшин не может его использовать?Почему он настаивает на наличии JDK?
  • Могу ли я встраивать JDK вместо JRE с моим приложением?
  • Могу ли я обнаружить эту проблему в своем коде до того, как сообщение Mac OS появится для пользователя, такя мог бы показать ему лучшее сообщение?
  • Любое другое предлагаемое решение, чтобы исправить это, не прося пользователя установить JDK на его Mac?

1 Ответ

1 голос
/ 08 июня 2019

Когда вы указываете java без абсолютного пути, есть вероятность, что его разрешение с помощью системного пути поиска команд заканчивается в исполняемом файле другой установки Java.

Для принудительного использованияна той же JVM, на которой вы уже работаете, разрешите команду для системного свойства java.home.

String jarPath = "MyMainJar.jar";
String jarCmd = Paths.get(System.getProperty("java.home"), "bin", "java").toString();
String [] cmd = { jarCmd, "-jar", jarPath };
ProcessBuilder processBuilder = new ProcessBuilder(cmd);
Process process = processBuilder.start();

В качестве примечания не используйте -noverify.Преимущества этих опций, в случае их наличия, не оправдывают его рисков.

Кроме того, если вы не планируете передавать построенный ввод новому процессу или анализировать его вывод, его стоит объединить в цепочку .inheritIO() до ProcessBuilder, поэтому новый процесс будет использовать те же каналы ввода / вывода, что и родительский процесс, вместо создания каналов.

...