Попередження 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
Kristof Neirynck

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]

7
Чи можна це зробити прогресивно?
facetoe

12
Я можу підтвердити, що він не працюватиме, якщо це зроблено під HKEY_CURRENT_USER. Краще питання: чому на базі Java продукт, що базується на Java, прив'язується до реєстру Windows?
avgvstvs

5
Неможливо, щоб користувацька програма вимагала від користувача переходити до реєстру. Чому Java завжди реалізує подібні напіврозчини.
Ель Мак

15
У моїй установці Windows 10 встановлені обидва ключові шляхи, зазначені вище, для виправлення моєї установки потрібно додати Prefs до 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, тим самим викликаючи попередження. Це цікава тонка помилка.

Існує виправлення, пов’язане з джерелом JDK в червні 2016 року, і воно є частиною Java9. Там також перенести для Java8 , який знаходиться в U202.

Те, що ви бачите, насправді є попередженням із внутрішнього реєстратора JDK. Це не виняток. Я вважаю, що попередження можна сміливо ігнорувати .... якщо тільки код користувача справді не бажає системних налаштувань, але це дуже рідко.

Інформація про бонус

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


Дякую за такий глибокий аналіз. Випуск 8139507 , про який ви згадали, говорить про те, що помилка виправлена ​​в JDK 9.
realsonic

3
@realsonic. Додавши до цього: Схоже, Oracle нарешті обійшов підтримку цього виправлення. Він зафіксований у 8u202 . (станом на 30Sep2018, останній реліз Java 8 - це u181, тому виправлення підтримується, але ще не в будь-якій випущеній версії)
peterh

30

Якщо хтось намагається вирішити це в 64-бітній версії Windows, вам може знадобитися створити наступний ключ:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
Я отримав цю помилку під час використання 64-розрядного JVM на 64-розрядній Windows 7, і рішення, яке запропонували Денніс та МКорш, працювало для мене просто чудово. Можливо, рішення Wow6432Node призначене для 32-розрядних JVM в 64-бітних Windows.
Скотт Джонсон

7

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


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]

... тоді виконайте його.


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 Failed


Ну, точніше, це тому, що в JDK є помилка. Дивіться прийняту відповідь за посиланням у вашій відповіді.
peterh

Насправді це не помилка - налаштування для всіх машин дозволяються лише користувачам адміністратора машини. Використовуйте runasдля запуску програми як локального користувача адміністратора, і вона з радістю створить ключ реєстру під HKLM. Те, що у Java немає, - це механізм вимагати підвищених дозволів (тобто в ідеалі він би посилався на UAC Windows, а не на збій - сумнівно, чи це загальнодобрана ідея).
ddimitrov

0

Проблема - справді ключ реєстрації, якого немає. Його можна створити вручну

АБО

її можна створити автоматично , запустивши програму як адміністратор один раз. Це дасть програмі необхідні дозволи, і коли вона буде запускатися як звичайна, вона все одно буде працювати правильно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.