Ostrzeżenie Groovy Shell „Nie można otworzyć / utworzyć węzła głównego prefs…”

188

Próbowałem otworzyć Groovy Shell ( groovysh) w systemie Windows 8 i uzyskałem następujące dane wyjściowe:

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.

Po wydrukowaniu powyższego komunikatu powłoka uruchomiła się zgodnie z oczekiwaniami.

Dennis Traub
źródło
3
Jest to spowodowane błędem: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck
1
Preferencje zapisane w pliku jako magazynie kopii zapasowych powinny całkowicie uniknąć tego problemu. Są sytuacje, w których poleganie na użytkownikach końcowych w celu zmiany ich ohydnego rejestru nie jest realnym rozwiązaniem.
Dave Jarvis,
2
Jest to znany błąd Java nadal występujący w systemie Windows 10 i aktualizacji 112. Wystarczy uruchomić program raz z podwyższonego monitu i zniknie.
david.pfx

Odpowiedzi:

328

Odpowiedź Dennisa jest prawidłowa. Chciałbym jednak wyjaśnić to rozwiązanie w nieco bardziej szczegółowy sposób (dla użytkownika systemu Windows):

  1. Przejdź do menu Start i wpisz regeditw polu wyszukiwania.
  2. Przejdź do ścieżki HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 wydaje się teraz mieć to tutaj HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft:)
  3. Kliknij prawym przyciskiem myszy folder JavaSoft i kliknij New->Key
  4. Nazwij nowy klucz Prefsi wszystko powinno działać.

Alternatywnie, zapisz i uruchom *.regplik o następującej treści:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
MKorsch
źródło
7
Czy można to zrobić progresywnie?
facetoe
12
Mogę potwierdzić, że nie zadziała, jeśli wykonasz to pod HKEY_CURRENT_USER. Lepsze pytanie, dlaczego, u licha, produkt oparty na Javie łączy się z rejestrem Windows?
avgvstvs
5
Aplikacja konsumencka nie może wymagać od użytkownika, aby brał udział w rejestrze. Dlaczego Java zawsze implementuje pół-rozwiązania tego typu.
El Mac
15
Moja instalacja systemu Windows 10 ma oba kluczowych ścieżek wskazano powyżej, ustalające moja instalacja wymagane dodanie Prefs do HKEY_LOCAL_MACHINE \ Software \ JavaSoft nie HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124
2
W systemie Windows 10 nadal właściwą lokalizacją folderu Perfs jestHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur
72

Udało mi się rozwiązać problem, ręcznie tworząc następujący klucz rejestru:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Dennis Traub
źródło
Czy mógłbyś mi powiedzieć dokładny proces? Pracuję głównie na komputerach Mac, ale pojawia się ten błąd, gdy uruchamiam program w systemie Windows i chciałbym wiedzieć, jak go naprawić.
Meshulam Silk
14
Widzę to w oprogramowaniu, które sprzedajemy. Poprawka automatyczna / programowa byłaby lepsza, jeśli masz jedną z nich. Mówienie moim użytkownikom końcowym, aby skoczyli w regedit, jest przerażające. Czy istnieje sposób, aby Java zrobiła to automatycznie w Windows 8.1 (która jest jedyną platformą, na której widzę błąd).
Brian Knoblauch
Błąd występuje również w systemie Windows 10, a ta poprawka zadziałała
TriumphST
45

To jest właściwie błąd JDK. Zostało to zgłoszone kilkakrotnie na przestrzeni lat, ale dopiero w 8139507 Oracle w końcu poważnie to potraktowało.

Problem dotyczył kodu źródłowego JDK dla WindowsPreferences.java. W tej klasie oba węzły userRooti systemRootzostały zadeklarowane jako statyczne, jak w:

/**
 * 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);

Oznacza to, że przy pierwszym odwołaniu do klasy zainicjowane zostaną obie zmienne statyczne, w wyniku czego HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsnastąpi próba utworzenia klucza rejestru (= drzewo systemowe), jeśli jeszcze nie istnieje.

Więc nawet jeśli użytkownik podejmie wszelkie środki ostrożności w swoim własnym kodzie i nigdy nie dotknie drzewa systemowego ani nie będzie do niego odwoływał, wówczas JVM nadal będzie próbował utworzyć instancję systemRoot, powodując ostrzeżenie. To interesujący subtelny błąd.

Wprowadzono poprawkę dotyczącą źródła JDK w czerwcu 2016 r. I jest ona częścią Java9 i późniejszych wersji. Istnieje również backport dla Java8, który jest w wersji u202.

To, co widzisz, jest naprawdę ostrzeżeniem z wewnętrznego rejestratora JDK. To nie jest wyjątek. Uważam, że ostrzeżenie można bezpiecznie zignorować ... chyba że kod użytkownika rzeczywiście chce preferencji systemowych, ale tak się rzadko zdarza.

Informacje o bonusie

Błąd nie ujawniał się w wersjach wcześniejszych niż Java 1.7.21, ponieważ do tego czasu instalator JRE tworzył HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsdla ciebie klucz rejestru , co skutecznie ukrywałoby błąd. Z drugiej strony nigdy tak naprawdę nie było wymagane uruchomienie instalatora, aby mieć JRE na twoim komputerze, a przynajmniej nie było to intencją Sun / Oracle. Jak zapewne wiesz, Oracle od .tar.gzwielu lat dystrybuuje środowisko JRE dla Windows w formacie.

Peter
źródło
Dzięki za tak głęboką analizę. W wspomnianym przez ciebie numerze 8139507 napisano , że błąd został naprawiony w JDK 9.
realsonic
3
@realsonic. Dodatkowo: wygląda na to, że Oracle w końcu zajął się backportowaniem tej poprawki. Zostało to naprawione w 8u202 . (od 30Sep2018 najnowszą wersją Java 8 jest u181, więc poprawka jest cofnięta, ale nie jest jeszcze w żadnej wydanej wersji)
peterh
30

Jeśli ktoś próbuje rozwiązać ten problem w 64-bitowej wersji systemu Windows, konieczne może być utworzenie następującego klucza:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
walkern
źródło
9
Wystąpił ten błąd podczas korzystania z 64-bitowej maszyny JVM w 64-bitowym systemie Windows 7, a rozwiązanie zaproponowane przez Dennisa i MKorscha działało dobrze dla mnie. Być może rozwiązanie Wow6432Node jest przeznaczone dla 32-bitowych maszyn JVM w 64-bitowym systemie Windows.
Scott Johnson
7

Problem polega na tym, że prosta konsola nie może edytować rejestru. Nie trzeba ręcznie edytować rejestru, wystarczy uruchomić groovyshraz z uprawnieniami administratora. Wszystkie kolejne uruchomienia działają bezbłędnie.

Darksnake
źródło
2
Dzięki, sugerowałbym innym wypróbowanie tego, jest to najprostsze rozwiązanie :)
Aditya T
1
Najłatwiejsza odpowiedź powinna być na górze. Miałem to ostrzeżenie podczas wykonywania testów JMeter, ale zacząłem, gdy jmeter.bat jako Administrator zniknęło.
KB
2

Miał podobny problem podczas uruchamiania jmpera apache w 64-bitowym systemie Windows 8:

[]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.

Z powodzeniem zastosowane rozwiązanie Dennis Traub z objaśnieniami Mkorsch. Możesz też utworzyć plik z rozszerzeniem „reg” i wpisać w nim następujące informacje:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... a następnie go uruchom.

razvanone
źródło
1

Otrzymałem następujący komunikat:

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

i zniknął po utworzeniu jednego z tych kluczy rejestru, mój jest 64-bitowy, więc spróbowałem tylko tego.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Sohail Ahmed
źródło
1

To mi się przydarzyło.

Najwyraźniej dzieje się tak, ponieważ Java nie ma uprawnień do tworzenia kluczy rejestru.

Zobacz: Java: java.util.Preferences Błąd

Wolsie
źródło
Dokładniej, ponieważ jest to błąd w JDK. Zobacz zaakceptowaną odpowiedź na link w swojej odpowiedzi.
peterh
To naprawdę nie jest błąd - ustawienia na całym komputerze są dozwolone tylko dla administratorów komputerów. Służy runasdo uruchamiania aplikacji jako lokalny administrator. Z przyjemnością utworzy on klucz rejestru pod HKLM. To, czego Java nie ma, to mechanizm pytający o podwyższone uprawnienia (tzn. Idealnie wywołałby Windows UAC zamiast zawieść - wątpliwe jest, czy jest to ogólnie dobry pomysł).
ddimitrov,
0

Problemem jest rzeczywiście brakujący klucz rejestru. Można go utworzyć ręcznie

LUB

można go utworzyć automatycznie , uruchamiając program raz jako administrator. To da programowi wymagane uprawnienia, a kiedy będzie uruchamiany normalnie, nadal będzie działał poprawnie.

Alessandro Roaro
źródło