Предупреждение Groovy Shell "Не удалось открыть / создать корневой узел prefs..."

Я пытался открыть Groovy Shell (groovysh) на Windows 8 и получил следующий вывод:

java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs 
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

После распечатки вышеуказанного сообщения оболочка запустилась как положено.

8 ответов

Решение

Денис ответ правильный. Однако я хотел бы объяснить решение более подробно (для пользователей Windows):

  1. Зайдите в меню "Пуск" и введите regedit в поле поиска.
  2. Перейдите к пути HKEY_LOCAL_MACHINE\Software\JavaSoft (Windows 10, кажется, теперь имеет это здесь: HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft)
  3. Щелкните правой кнопкой мыши папку JavaSoft и выберите New -> Key
  4. Назовите новый ключ Prefs и все должно работать.

Или сохраните и выполните *.reg файл со следующим содержанием:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]

Мне удалось решить проблему, вручную создав следующий раздел реестра:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

На самом деле это ошибка JDK. Об этом сообщалось несколько раз за прошедшие годы, но только в 8139507 годах оно было окончательно воспринято Oracle.

Проблема была в исходном коде JDK для WindowsPreferences.java, В этом классе оба узла userRoot а также systemRoot были объявлены статическими как в:

/**
 * User root node.
 */
static final Preferences userRoot =
     new WindowsPreferences(USER_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);

/**
 * System root node.
 */
static final Preferences systemRoot =
    new WindowsPreferences(SYSTEM_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);

Это означает, что при первом обращении к классу будут инициированы обе статические переменные, и этот ключ реестра для HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs (= системное дерево) будет попытаться создать, если он еще не существует.

Таким образом, даже если пользователь примет все меры предосторожности в своем собственном коде и никогда не будет касаться или ссылаться на системное дерево, JVM все равно попытается создать экземпляр systemRoot, тем самым вызывая предупреждение. Это интересная тонкая ошибка.

В июне 2016 года исправлено исправление источника JDK, и оно является частью Java9 и далее. Также есть бэкпорт для Java8, который есть в u202.

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

Информация о бонусе

Ошибка не проявлялась в версиях до Java 1.7.21, потому что до этого установщик JRE создавал раздел реестра HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs для вас, и это будет эффективно скрывать ошибку. С другой стороны, вам никогда не требовалось запускать установщик, чтобы иметь JRE на вашем компьютере, или, по крайней мере, это не было целью Sun/Oracle. Как вы, возможно, знаете, Oracle распространяет JRE для Windows в .tar.gz формат на долгие годы.

Если кто-то пытается решить эту проблему в 64-разрядной версии Windows, вам может потребоваться создать следующий ключ:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

Проблема в том, что простая консоль не может редактировать реестр. Нет необходимости редактировать реестр вручную, просто запустите groovysh один раз с административными привилегиями. Все последующие запуски работают без ошибок.

Была аналогичная проблема при запуске Apache Jmeter на Windows 8 64 бит:

[]apache-jmeter-2.13\bin>jmeter
java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs     at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

Успешно использовал решение Дениса Трауба с объяснениями Мкорша. Или вы можете создать файл с расширением "reg" и записать в него следующее:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... затем выполните это.

Я получил следующее сообщение:

Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002

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

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

Это случилось со мной.

Очевидно, это потому, что у Java нет разрешения на создание разделов реестра.

См.: Java: java.util.Preferences Failing

Проблема действительно в том, что отсутствует регистрационный ключ. Его можно создать вручную

ИЛИ

его можно создать автоматически, запустив программу от имени администратора один раз. Это даст программе необходимые разрешения, и когда она будет запущена в обычном режиме, она все равно будет работать правильно.

Другие вопросы по тегам