Предупреждение 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):
- Зайдите в меню "Пуск" и введите
regedit
в поле поиска. - Перейдите к пути
HKEY_LOCAL_MACHINE\Software\JavaSoft
(Windows 10, кажется, теперь имеет это здесь:HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
) - Щелкните правой кнопкой мыши папку JavaSoft и выберите
New
->Key
- Назовите новый ключ
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 нет разрешения на создание разделов реестра.
Проблема действительно в том, что отсутствует регистрационный ключ. Его можно создать вручную
ИЛИ
его можно создать автоматически, запустив программу от имени администратора один раз. Это даст программе необходимые разрешения, и когда она будет запущена в обычном режиме, она все равно будет работать правильно.