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.
windows
groovy
groovyshell
Dennis Traub
źródło
źródło
Odpowiedzi:
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):
regedit
w polu wyszukiwania.HKEY_LOCAL_MACHINE\Software\JavaSoft
(Windows 10 wydaje się teraz mieć to tutajHKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
:)New
->Key
Prefs
i wszystko powinno działać.Alternatywnie, zapisz i uruchom
*.reg
plik o następującej treści:źródło
HKEY_LOCAL_MACHINE\Software\JavaSoft
Udało mi się rozwiązać problem, ręcznie tworząc następujący klucz rejestru:
źródło
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łyuserRoot
isystemRoot
zostały zadeklarowane jako statyczne, jak w:Oznacza to, że przy pierwszym odwołaniu do klasy zainicjowane zostaną obie zmienne statyczne, w wyniku czego
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
nastą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\Prefs
dla 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.gz
wielu lat dystrybuuje środowisko JRE dla Windows w formacie.źródło
Jeśli ktoś próbuje rozwiązać ten problem w 64-bitowej wersji systemu Windows, konieczne może być utworzenie następującego klucza:
źródło
Problem polega na tym, że prosta konsola nie może edytować rejestru. Nie trzeba ręcznie edytować rejestru, wystarczy uruchomić
groovysh
raz z uprawnieniami administratora. Wszystkie kolejne uruchomienia działają bezbłędnie.źródło
Miał podobny problem podczas uruchamiania jmpera apache w 64-bitowym systemie Windows 8:
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:
... a następnie go uruchom.
źródło
Otrzymałem następujący komunikat:
i zniknął po utworzeniu jednego z tych kluczy rejestru, mój jest 64-bitowy, więc spróbowałem tylko tego.
źródło
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
źródło
runas
do 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ł).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.
źródło