Почему BlueJ не может учитывать мой Java-дом, тогда как Eclipse может

Я хочу установить BlueJ вручную по причине переносимости. Я установил Java_Home и добавил каталог Java bin в переменную среды path. Я использую симлинк на c:java что указывает на d:java на SD карту.

Почему BlueJ не учитывает их, все еще делая вид, что он не может обнаружить jdk.

Update: Eclipse в порядке, так что есть что-то конкретное с BlueJ и Jdk 1.8 ?

1 ответов


я только что сделал чистую установку BlueJ и JDK 1.8 на отдельных дисках для репликации вашей проблемы. Я сделал символическую ссылку на JDK и поместил это в JAVA_HOME и PATH (из-за использования C:\ синтаксис, я догадался, что вы были на Windows, поэтому я тестировал на Windows 8.1).

я тоже обнаружил, что Настройка переменных среды была проигнорирована BlueJ при выборе JDK для использования при его запуске. Я мог бы изменить JDK, используя сопутствующую программу выберите BlueJ VM, но не удалось ввести там символическую ссылку (я считаю, что в более ранних версиях изменение VM было настройкой в меню "Пуск", а не отдельной программой).

в итоге:

  • это не проблема с совместимостью BlueJ и Java 8
  • это не проблема с символической ссылкой
  • для Windows, по крайней мере, это связано с тем, как BlueJ определяет и сохраняет, какой JDK он использует (оба действия через реестр).
  • вы можете вручную изменить ключ реестра для вашей ссылки, если вы хотите (см. ниже), но это дополнительные установки.

подробно

я обнаружил, что BlueJ хранит этот путь к JDK, который он использует в следующем разделе реестра

HKEY_CURRENT_USER\Software\BlueJ\BlueJ.1.5\CurrentVM

Примечание корень может быть HKEY_USERS или HKEY_LOCAL_MACHINE в зависимости от того, установили ли вы для одного пользователя или всех пользователей компьютера.

проблема в том, что этот ключ устанавливается автоматически, если ваша система имеет только одна виртуальная машина доступна во время выполнения или при первом запуске BlueJ или выберите BlueJ VM программа в любое время позже. Параметры, предлагаемые вам, - это JDK, которые пусковая установка может обнаружить (через реестр) в вашей системе в этот момент. Как только это значение установлено, оно не изменяется динамически во время выполнения для отражения JAVA_HOME. Даже используя опцию "обзор" из опций, я не мог установить символическую ссылку как местоположение JDK через GUI.

вы можете, однако, вручную измените значение этого раздела реестра (например, через regedit) к вашему значению символической ссылки (проверено и проверено OK-может потребоваться разрешение администратора).


я посмотрел на исходный код определить как CurrentVM установлен.

после довольно короткого трала (слава разработчикам BlueJ для хорошего именования), я в конце концов понял, что фактический код, используемый для запуска BlueJ, - это C++ файл в \package\winlaunch\bjlaunch.cc (исходный файл mercurial ссылка здесь).

это просто проверяет значение раздела реестра и, если он не существует, если вызывает findRegistryVMs(), который проверяет реестр (не переменные среды) для существующих виртуальных машин и предлагает их пользователю. Таким образом, не существует способа заставить BlueJ использовать значение из JAVA_HOME без ручного редактирования реестра.


Б. Н. если вы вручную измените это значение ключа на символическую ссылку, вы можете изменить, где символическая ссылка ссылается на и (с перезагрузкой) BlueJ будет использовать тот JDK, с которым связана символическая ссылка. Опять же, испытано и проверено на Windows 8.1

Б. Н. 2 сначала все выглядело оптимистично: в Installer.java существует метод под названием findJavaPath() это первая проверка

String javaHome = System.getProperty("java.home");

прежде, чем иметь несколько догадок, если это не сработает. Таким образом, похоже, что он должен уважать значение JAVA_HOME во время установки. , похоже, это используется только для проверки наличия совместимой (1.6+) версии Java.