Avviso Groovy Shell "Impossibile aprire / creare il nodo radice delle preferenze ..."


188

Ho provato ad aprire Groovy Shell ( groovysh) su Windows 8 e ho ottenuto il seguente output:

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.

Dopo aver stampato il messaggio sopra, la shell si è avviata come previsto.



1
Le preferenze salvate in un file come archivio di backup dovrebbero evitare del tutto il problema. Ci sono situazioni in cui affidarsi agli utenti finali per modificare il loro abominevole registro non è una soluzione praticabile.
Dave Jarvis,

2
È un bug Java noto ancora presente su Windows 10 e aggiorna 112. Basta eseguire il programma una volta da un prompt elevato e scompare.
david.pfx,

Risposte:


328

La risposta di Dennis è corretta. Tuttavia, vorrei spiegare la soluzione in modo un po 'più dettagliato (per utenti Windows):

  1. Vai nel menu Start e digita regeditnel campo di ricerca.
  2. Vai al percorso HKEY_LOCAL_MACHINE\Software\JavaSoft(sembra che Windows 10 ora abbia questo qui HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft:)
  3. Fare clic con il tasto destro sulla cartella JavaSoft e fare clic su New->Key
  4. Assegna un nome alla nuova chiave Prefse tutto dovrebbe funzionare.

In alternativa, salva ed esegui un *.regfile con il seguente contenuto:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]

7
È possibile farlo in modo programmatico?
facetoe

12
Posso confermare che non funzionerà se eseguito in HKEY_CURRENT_USER. Una domanda migliore, perché mai un prodotto basato su Java si lega al registro di Windows?
avgvstvs,

5
Non è possibile per un'applicazione consumer richiedere all'utente di andare a giocherellare con il registro. Perché Java implementa sempre mezze soluzioni come questa.
El Mac,

15
La mia installazione di Windows 10 ha entrambi i percorsi chiave indicati sopra, correggendo la mia installazione richiesta aggiungendo Prefs a HKEY_LOCAL_MACHINE \ Software \ JavaSoft, non HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124

2
Su Windows 10 la posizione corretta per la cartella Perfs è ancoraHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur

72

Sono stato in grado di risolvere il problema creando manualmente la seguente chiave di registro:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

Ti dispiacerebbe dirmi il processo esatto? Lavoro principalmente su Mac ma visualizzo questo errore quando eseguo il mio programma su Windows e vorrei sapere come risolverlo.
Meshulam Silk,

14
Lo vedo sul software che vendiamo. Una correzione automatica / programmatica sarebbe migliore se ne hai anche una. Dire ai miei utenti finali di entrare in regedit è una prospettiva spaventosa. C'è un modo per convincere Java a farlo automaticamente su Windows 8.1 (che è l'unica piattaforma su cui vedo l'errore).
Brian Knoblauch,

L'errore si verifica anche in Windows 10 e questa correzione ha funzionato
TriumphST

45

Questo è in realtà un bug JDK. È stato segnalato più volte nel corso degli anni, ma solo nell'8139507 è stato finalmente preso sul serio da Oracle.

Il problema era nel codice sorgente JDK per WindowsPreferences.java. In questa classe, entrambi i nodi userRoote systemRootsono stati dichiarati statici come in:

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

Ciò significa che la prima volta che viene fatto riferimento alla classe verranno avviate entrambe le variabili statiche e da ciò HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsverrà tentata la creazione della chiave di registro per (= albero del sistema) se non esiste già.

Quindi, anche se l'utente prendesse tutte le precauzioni nel proprio codice e non toccasse o non facesse mai riferimento all'albero del sistema, la JVM tenterebbe comunque di systemRootcreare un'istanza , causando così l'avvertimento. È un bug sottile interessante.

È stata apportata una correzione al sorgente JDK a giugno 2016 e fa parte di Java9 in poi. C'è anche un backport per Java8 che si trova in u202.

Quello che vedi è davvero un avvertimento dal logger interno del JDK. Non fa eccezione. Credo che l'avviso possa essere tranquillamente ignorato .... a meno che il codice utente non desideri davvero le preferenze di sistema, ma è molto raro.

Informazioni sul bonus

Il bug non si era rivelato nelle versioni precedenti a Java 1.7.21, perché fino a quel momento il programma di installazione di JRE avrebbe creato la chiave di registro HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsper te e questo avrebbe effettivamente nascosto il bug. D'altra parte non ti è mai stato richiesto di eseguire un programma di installazione per avere un JRE sul tuo computer, o almeno questo non è stato l'intento di Sun / Oracle. Come forse saprai, Oracle distribuisce JRE per Windows in .tar.gzformato da molti anni.


Grazie per un'analisi così approfondita. Il numero 8139507 , che hai menzionato, dice che il bug è stato corretto in JDK 9.
realsonic,

3
@realsonic. Aggiungendo a ciò: sembra che Oracle sia finalmente riuscita a eseguire il backport di questa correzione. È stato risolto in 8u202 . (a partire da 30Sep2018 l'ultima versione di Java 8 è u181, quindi la correzione è backported ma non ancora in alcuna versione rilasciata)
peterh

30

Se qualcuno sta tentando di risolverlo su una versione a 64 bit di Windows, potrebbe essere necessario creare la chiave seguente:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
Ho riscontrato questo errore durante l'utilizzo di una JVM a 64 bit su Windows 7 a 64 bit e la soluzione proposta da Dennis e MKorsch ha funzionato perfettamente per me. Forse la soluzione Wow6432Node è per JVM a 32 bit su Windows a 64 bit.
Scott Johnson,

7

Il problema è che la console semplice non può modificare il registro. Non è necessario modificare manualmente il registro, basta avviare groovyshuna volta con i privilegi di amministratore. Tutti i lanci successivi funzionano senza errori.


2
Grazie, suggerirei ad altri di provare questo, è la soluzione più semplice :)
Aditya T

1
La risposta più semplice dovrebbe essere in cima. Ho avuto questo avviso durante l'esecuzione dei test JMeter, ma ho iniziato una volta che jmeter.bat come amministratore e l'avviso è sparito.
KB

2

Si è verificato un problema simile all'avvio di apache jmeter su Windows 8 a 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.

Soluzione Dennis Traub utilizzata con successo, con spiegazioni di Mkorsch. Oppure puoi creare un file con l'estensione "reg" e scrivere in esso il seguente:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... quindi eseguilo.


1

Stavo ricevendo il seguente messaggio:

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

ed è scomparso dopo aver creato una di queste chiavi di registro, la mia è a 64 bit, quindi ho provato solo quello.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

1

Questo mi è successo.

Apparentemente è perché Java non ha i permessi per creare chiavi di registro.

Vedere: Java: java.util.Preferences non riuscito


Bene, più precisamente è perché c'è un bug nel JDK. Vedi la risposta accettata sul link nella tua risposta.
Pietro

Non è proprio un bug: le impostazioni a livello di macchina sono consentite solo agli utenti amministratori della macchina. Utilizzare runasper eseguire l'applicazione come utente amministratore locale e creerà felicemente la chiave di registro in HKLM. Ciò che Java non ha è un meccanismo per richiedere permessi elevati (cioè idealmente avrebbe invocato l'UAC di Windows invece di fallire - è discutibile se questa sia una buona idea universalmente).
ddimitrov,

0

Il problema è davvero la chiave di registro che manca. Può essere creato manualmente

O

può essere creato automagicamente eseguendo il programma come amministratore una volta. Ciò fornirà al programma le autorizzazioni necessarie e quando verrà eseguito normalmente funzionerà comunque correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.