Groovy Shell-Warnung "Prefs-Stammknoten konnte nicht geöffnet / erstellt werden ..."

188

Ich habe versucht, die Groovy Shell ( groovysh) unter Windows 8 zu öffnen und habe die folgende Ausgabe erhalten:

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.

Nach dem Drucken der obigen Nachricht wurde die Shell wie erwartet gestartet.

Dennis Traub
quelle
3
Dies ist auf einen Fehler zurückzuführen: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck
1
In einer Datei als Sicherungsspeicher gespeicherte Einstellungen sollten das Problem vollständig vermeiden. Es gibt Situationen, in denen es keine praktikable Lösung ist, sich darauf zu verlassen, dass Endbenutzer ihre abscheuliche Registrierung ändern .
Dave Jarvis
2
Es ist ein bekannter Java-Fehler, der immer noch auf Windows 10 und Update 112 auftritt. Führen Sie das Programm einfach einmal an einer Eingabeaufforderung mit erhöhten Rechten aus, und es verschwindet.
david.pfx

Antworten:

328

Dennis Antwort ist richtig. Ich möchte die Lösung jedoch etwas ausführlicher erläutern (für Windows-Benutzer):

  1. Gehen Sie in Ihr Startmenü und geben Sie regeditin das Suchfeld ein.
  2. Navigieren Sie zu Pfad HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 scheint nun diese hier haben: HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft)
  3. Klicken Sie mit der rechten Maustaste auf den JavaSoft-Ordner und klicken Sie auf New->Key
  4. Nennen Sie den neuen Schlüssel Prefsund alles sollte funktionieren.

Alternativ können Sie eine *.regDatei mit folgendem Inhalt speichern und ausführen :

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
MKorsch
quelle
7
Ist das progmatisch möglich?
Facetoe
12
Ich kann bestätigen, dass es unter HKEY_CURRENT_USER nicht funktioniert. Eine bessere Frage, warum um alles in der Welt bindet sich ein Java-basiertes Produkt an die Windows-Registrierung?
avgvstvs
5
Für eine Verbraucheranwendung ist es nicht möglich, dass der Benutzer mit der Registrierung experimentiert. Warum implementiert Java immer solche Halblösungen?
El Mac
15
Bei meiner Windows 10-Installation sind beide oben angegebenen Schlüsselpfade vorhanden. Um meine Installation zu korrigieren, müssen die Einstellungen zu HKEY_LOCAL_MACHINE \ Software \ JavaSoft hinzugefügt werden, nicht zu HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124,
2
Unter Windows 10 ist immer noch der richtige Speicherort für den Perfs-OrdnerHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur
72

Ich konnte das Problem beheben, indem ich den folgenden Registrierungsschlüssel manuell erstellte:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Dennis Traub
quelle
Würde es Ihnen etwas ausmachen, mir den genauen Prozess zu erzählen? Ich arbeite hauptsächlich auf dem Mac, aber ich erhalte diesen Fehler, wenn ich mein Programm unter Windows ausführe und ich möchte wissen, wie ich es beheben kann.
Meshulam Silk
14
Ich sehe das an Software, die wir verkaufen. Eine automatische / programmatische Korrektur wäre besser, wenn Sie auch eine davon haben. Es ist eine beängstigende Aussicht, meinen Endbenutzern zu sagen, dass sie in regedit einsteigen sollen. Gibt es eine Möglichkeit, Java dazu zu bringen, dies unter Windows 8.1 automatisch zu tun (dies ist die einzige Plattform, auf der der Fehler angezeigt wird)?
Brian Knoblauch
Fehler tritt auch in Windows 10 auf, und dieses
Update hat
45

Dies ist eigentlich ein JDK-Fehler. Es wurde im Laufe der Jahre mehrmals berichtet, aber erst 8139507 wurde es von Oracle endgültig ernst genommen.

Das Problem lag im JDK-Quellcode für WindowsPreferences.java. In dieser Klasse wurden beide Knoten userRootund systemRootwie folgt als statisch deklariert:

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

Dies bedeutet, dass beim ersten Referenzieren der Klasse beide statischen Variablen initiiert werden und auf diese HKEY_LOCAL_MACHINE\Software\JavaSoft\PrefsWeise versucht wird, den Registrierungsschlüssel für (= Systembaum) zu erstellen, falls dieser noch nicht vorhanden ist.

Selbst wenn der Benutzer alle Vorsichtsmaßnahmen in seinem eigenen Code getroffen und den Systembaum nie berührt oder referenziert hätte, würde die JVM tatsächlich versuchen, zu instanziieren systemRoot, wodurch die Warnung ausgelöst wird. Es ist ein interessanter subtiler Fehler.

Im Juni 2016 wurde ein Fix für die JDK-Quelle festgelegt, der Teil von Java9 ist. Es gibt auch einen Backport für Java8 in u202.

Was Sie sehen, ist wirklich eine Warnung vom internen Logger des JDK. Es ist keine Ausnahme. Ich glaube, dass die Warnung sicher ignoriert werden kann ... es sei denn, der Benutzercode möchte tatsächlich die Systemeinstellungen, aber das ist sehr selten der Fall.

Bonusinfo

Der Fehler trat in Versionen vor Java 1.7.21 nicht auf, da das JRE-Installationsprogramm bis dahin einen Registrierungsschlüssel HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsfür Sie erstellt und den Fehler dadurch effektiv ausgeblendet hat . Andererseits mussten Sie nie wirklich ein Installationsprogramm ausführen, um eine JRE auf Ihrem Computer zu haben, oder zumindest war dies nicht die Absicht von Sun / Oracle. Wie Sie vielleicht wissen, vertreibt Oracle die JRE für Windows .tar.gzseit vielen Jahren im Format.

Peterh
quelle
Vielen Dank für eine so gründliche Analyse. Das von Ihnen erwähnte Problem 8139507 besagt, dass der Fehler in JDK 9 behoben wurde.
Realsonic
3
@realsonic. Hinzu kommt, dass Oracle dieses Update anscheinend endlich zurückportiert hat. Es ist in 8u202 behoben . (Ab dem
Peterh
30

Wenn jemand versucht, dies unter einer 64-Bit-Version von Windows zu lösen, müssen Sie möglicherweise den folgenden Schlüssel erstellen:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Walkern
quelle
9
Ich habe diesen Fehler bei der Verwendung einer 64-Bit-JVM unter 64-Bit-Windows 7 erhalten, und die von Dennis und MKorsch vorgeschlagene Lösung hat für mich einwandfrei funktioniert. Möglicherweise ist die Wow6432Node-Lösung für 32-Bit-JVMs unter 64-Bit-Windows geeignet.
Scott Johnson
7

Das Problem ist, dass die einfache Konsole die Registrierung nicht bearbeiten kann. Sie müssen die Registrierung nicht manuell bearbeiten, sondern müssen sie nur groovysheinmal mit Administratorrechten starten . Alle nachfolgenden Starts funktionieren fehlerfrei.

Dunkelschlange
quelle
2
Danke, ich würde anderen empfehlen, dies zu versuchen, es ist die einfachste Lösung :)
Aditya T
1
Die einfachste Antwort sollte oben sein. Ich hatte diese Warnung, die JMeter-Tests ausführte, aber ich habe einmal die jmeter.bat als Administrator gestartet und die Warnung ist weg.
KB
2

Hatte ein ähnliches Problem beim Starten von Apache Jmeter unter Windows 8 64 Bit:

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

Erfolgreich eingesetzte Dennis Traub-Lösung mit Mkorsch-Erklärungen. Oder Sie erstellen eine Datei mit der Erweiterung "reg" und schreiben Folgendes ein:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... dann ausführen.

Razvanon
quelle
1

Ich habe die folgende Nachricht erhalten:

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

und es war weg, nachdem ich einen dieser Registrierungsschlüssel erstellt hatte, meiner ist 64 Bit, also habe ich nur das versucht.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Sohail Ahmed
quelle
1

Das ist mir passiert.

Anscheinend liegt es daran, dass Java keine Berechtigung zum Erstellen von Registrierungsschlüsseln hat.

Siehe: Java: java.util.Preferences schlägt fehl

Wolsie
quelle
Genauer gesagt, weil es einen Fehler im JDK gibt. Die akzeptierte Antwort finden Sie unter dem Link in Ihrer Antwort.
Peterh
Es ist nicht wirklich ein Fehler - maschinenweite Einstellungen sind nur für Benutzer von Administratoren zulässig. Verwenden runasSie diese Option , um Ihre Anwendung als lokaler Administrator auszuführen, und der Registrierungsschlüssel wird unter HKLM erstellt. Was Java nicht hat, ist ein Mechanismus, um nach erhöhten Berechtigungen zu fragen (dh im Idealfall hätte es die Windows-Benutzerkontensteuerung aufgerufen, anstatt zu scheitern - es ist fraglich, ob dies eine allgemein gute Idee ist).
ddimitrov
0

Das Problem ist in der Tat der fehlende Registerschlüssel. Es kann manuell erstellt werden

ODER

Es kann automatisch erstellt werden, indem das Programm einmal als Administrator ausgeführt wird. Dadurch erhält das Programm die erforderlichen Berechtigungen, und wenn es wie gewohnt ausgeführt wird, funktioniert es weiterhin ordnungsgemäß.

Alessandro Roaro
quelle