La lettura e la scrittura da / per le preferenze Java non riesce su Windows 8 fresco,


Ho un'applicazione Java che legge da Preferences usando:

Preferences prefs = Preferences.userNodeForPackage(MyClass.class);
prefs.get((String)key, "");

Su una nuova macchina Windows 8 questo non riesce con:

WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs 
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

Il codice di errore 5 è accesso negato.

Non riesco a trovare nulla di sbagliato. Google e COSÌ le ricerche danno vecchi risultati relativi solo a Windows Vista / 7 dove si stava usando erroneamentesystemRoot (Come posso scrivere le preferenze di sistema con Java? Posso invocare UAC?).

L'errore può essere "curato" creando HKLM / Software / JavaSoft / Prefs e impostazione delle autorizzazioni per HKLM / Software / JavaSoft come menzionato qui Java: java.util.Preferenze non riuscite. Ma questo non è qualcosa che posso richiedere ai miei utenti di fare quando installano il programma.

Quindi sto cercando una soluzione migliore. Il mio ultimo disperato sforzo è semplicemente scrivere su file ma Mi piacerebbe evitarlo . Questo sembra anche correlato Sto cercando di usare le prefenze Java da XML SENZA usare il registro di Windows, ma vedo un Messaggio relativo al Registro di sistema ma è stato votato senza risposta.

Al momento sospetto un bug JVM Win8...

Domande

  • Qualcuno sa di una soluzione che non comporta la scrittura di file?
  • Perché lo stesso codice funziona perfettamente bene in Windows 7 ma fallisce miseramente in Windows 8?
Author: Community, 2013-09-01

1 answers

Recentemente ho iniziato a notare uno stesso avviso e ho pensato che significa che il registro non può essere scritto. Ma a un esame più attento ho notato che tutte le preferenze sono state aggiornate con successo in HKEY_CURRENT_USER comunque. Quindi mi sono incuriosito perché sto vedendo questo avvertimento.

Si è scoperto che il colpevole è questa variabile membro statico: WindowsPreferences.systemRoot

Sembra che Java tenti di inizializzare WindowsPreferences.systemRoot nel caso in cui venga utilizzato in seguito dal programma, e tale inizializzazione ovviamente fallisce se il programma non viene eseguito come amministratore.

Dal momento che stai usando le Preferenze.userNodeForPackage (), non avrai mai bisogno di systemRoot, quindi puoi tranquillamente ignorare quell'avviso.

Naturalmente, questa è una pratica orribile che Java tenta di inizializzare systemRoot quando non è richiesto.

Aggiornamento: Ho testato questo problema in varie versioni di Java e ho concluso che questo bug è stato introdotto in Java 1.7.0_21. Ha funzionato bene in Java 1.7.0_17 semplicemente perché il programma di installazione di quella versione creerebbe la cartella "Pref" nel registro! Ovviamente anche in quella versione se dovessi eliminare "Pref" dal registro di sistema, smetterebbe di funzionare, quindi è stata una soluzione sciocca da parte di Oracle per cominciare. Riempirò una segnalazione di bug.

Aggiornamento 2: Il messaggio di avviso non è un bug. Sembra essere il comportamento previsto: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6809488

 12
Author: Saeid Nourian, 2014-05-21 14:07:20