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

188

Я попытался открыть 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.

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

Деннис Трауб
источник
3
Это связано с ошибкой: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Кристоф Нейринк,
1
Предпочтения, сохраненные в файле в качестве резервного хранилища, должны полностью исключить проблему. Существуют ситуации, когда полагаться на то, что конечные пользователи изменяют свой отвратительный реестр , не является жизнеспособным решением.
Дэйв Джарвис
2
Это известная ошибка Java, которая все еще присутствует в WIndows 10 и обновлении 112. Просто запустите программу один раз из командной строки с повышенными правами, и она исчезнет.
david.pfx

Ответы:

328

Денис ответ правильный. Однако я хотел бы объяснить решение более подробно (для пользователей 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]
MKorsch
источник
7
Возможно ли сделать это программно?
Facetoe
12
Я могу подтвердить, что это не будет работать, если сделано в HKEY_CURRENT_USER. Лучший вопрос, почему продукт на основе Java привязывается к реестру Windows?
avgvstvs
5
Для потребительского приложения невозможно потребовать, чтобы пользователь пошел и возился с реестром. Почему Java всегда реализует такие полу-решения?
Эль Мак
15
Моя установка Windows 10 имеет оба указанных выше ключевых пути, для исправления моей установки требовалось добавить префы в HKEY_LOCAL_MACHINE \ Software \ JavaSoft, а не в HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124
2
В Windows 10 все еще правильное место для папки PerfsHKEY_LOCAL_MACHINE\Software\JavaSoft
Артур
72

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

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Деннис Трауб
источник
Не могли бы вы рассказать мне точный процесс? Я работаю в основном на Mac, но у меня появляется эта ошибка, когда я запускаю свою программу на Windows, и я хотел бы знать, как ее исправить.
Шелковый
14
Я вижу это на программном обеспечении, которое мы продаем. Автоматическое / программное исправление было бы лучше, если бы у вас тоже было это. Говорить моим конечным пользователям о необходимости перейти в regedit - страшная перспектива. Есть ли способ заставить Java делать это автоматически в Windows 8.1 (единственной платформе, на которой я вижу ошибку).
Брайан Кноблаух
Ошибка происходит и в Windows 10, и это исправление сработало
TriumphST
45

Это на самом деле ошибка 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формате.

peterh
источник
Спасибо за такой глубокий анализ. В упомянутом выше выпуске 8139507 говорится, что ошибка исправлена ​​в JDK 9.
realsonic
3
@realsonic. В добавление к этому: кажется, что Oracle наконец-то нашел способ сделать это исправление. Это исправлено в 8u202 . (по состоянию на 30Sep2018 последняя версия Java 8 - u181, поэтому исправление перенесено в бэкпорт, но еще не выпущено ни в одной выпущенной версии)
peterh
30

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
walkern
источник
9
Я получил эту ошибку при использовании 64-битной JVM в 64-битной Windows 7, и решение, которое предложили Деннис и MKorsch, прекрасно работало для меня. Возможно, решение Wow6432Node предназначено для 32-битных JVM в 64-битных Windows.
Скотт Джонсон
7

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

Darksnake
источник
2
Спасибо, я бы предложил другим попробовать это, это самое простое решение :)
Aditya T
1
Самый простой ответ, должен быть сверху. У меня было это предупреждение при выполнении тестов JMeter, но я запустил один раз jmeter.bat от имени администратора, и предупреждение исчезло.
КБ
2

Была аналогичная проблема при запуске 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]

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

razvanone
источник
1

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

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
Сохейл Ахмед
источник
1

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

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

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

Wolsie
источник
Точнее, потому что в JDK есть ошибка. Смотрите принятый ответ по ссылке в вашем ответе.
Петер
Это на самом деле не ошибка - общесистемные настройки разрешены только для пользователей с правами администратора. Используйте runasдля запуска приложения от имени локального администратора, и оно с радостью создаст раздел реестра в HKLM. В Java нет механизма запроса повышенных разрешений (то есть в идеале он должен был бы вызывать Windows UAC вместо сбоя - сомнительно, является ли это универсально хорошей идеей).
Ддимитров
0

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

ИЛИ

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

Алессандро Роаро
источник