Advertencia de Groovy Shell "No se pudo abrir / crear el nodo raíz de preferencias ..."

188

Intenté abrir Groovy Shell ( groovysh) en Windows 8 y obtuve el siguiente resultado:

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.

Después de imprimir el mensaje anterior, el shell comenzó como se esperaba.

Dennis Traub
fuente
3
Esto se debe a un error: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck
1
Las preferencias guardadas en un archivo como el almacén de respaldo deben evitar el problema por completo. Hay situaciones en las que confiar en los usuarios finales para cambiar su registro abominable no es una solución viable.
Dave Jarvis
2
Es un error conocido de Java que todavía existe en Windows 10 y la actualización 112. Simplemente ejecute el programa una vez desde un indicador elevado y desaparecerá.
david.pfx

Respuestas:

328

La respuesta de Dennis es correcta. Sin embargo, me gustaría explicar la solución de una manera un poco más detallada (para usuarios de Windows):

  1. Vaya a su menú Inicio y escriba regediten el campo de búsqueda.
  2. Navegue a la ruta HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 ahora parece tener esto aquí HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft)
  3. Haga clic derecho en la carpeta JavaSoft y haga clic en New->Key
  4. Nombre la nueva clave Prefsy todo debería funcionar.

Alternativamente, guarde y ejecute un *.regarchivo con el siguiente contenido:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
MKorsch
fuente
77
¿Es posible hacer esto progmáticamente?
Facetoe
12
Puedo confirmar que no funcionará si se realiza en HKEY_CURRENT_USER. Una mejor pregunta, ¿por qué demonios un producto basado en Java se vincula al Registro de Windows?
avgvstvs
55
No es posible que una aplicación de consumidor requiera que el usuario vaya y juegue con el registro. ¿Por qué Java siempre implementa medias soluciones como esta?
El Mac
15
Mi instalación de Windows 10 tiene las dos rutas de acceso indicadas anteriormente, la reparación de mi instalación requirió agregar Prefs a HKEY_LOCAL_MACHINE \ Software \ JavaSoft, no HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124
2
En Windows 10, la ubicación correcta para la carpeta Perfs esHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur
72

Pude resolver el problema creando manualmente la siguiente clave de registro:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Dennis Traub
fuente
¿Te importaría decirme el proceso exacto? Trabajo principalmente en Mac, pero recibo este error cuando ejecuto mi programa en Windows y me gustaría saber cómo solucionarlo.
Meshulam Silk
14
Estoy viendo esto en el software que vendemos. Una solución automática / programática sería mejor si tienes una de esas también. Decirles a mis usuarios finales que salten a regedit es una perspectiva aterradora. ¿Hay alguna manera de hacer que Java haga esto automáticamente en Windows 8.1 (que es la única plataforma en la que veo el error)?
Brian Knoblauch
El error también ocurre en Windows 10, y esta solución funcionó
TriumphST
45

Esto es en realidad un error JDK. Se ha informado varias veces a lo largo de los años, pero solo en 8139507 Oracle finalmente lo tomó en serio.

El problema estaba en el código fuente JDK para WindowsPreferences.java. En esta clase, ambos nodos userRooty systemRootse declararon estáticos como en:

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

Esto significa que la primera vez que se haga referencia a la clase , se iniciarán ambas variables estáticas y, de este modo HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs, se intentará crear la clave de registro para (= árbol del sistema) si aún no existe.

Entonces, incluso si el usuario tomara todas las precauciones en su propio código y nunca tocara o hiciera referencia al árbol del sistema, entonces la JVM aún trataría de crear una instancia systemRoot, causando la advertencia. Es un error sutil interesante.

Hay una solución comprometida con la fuente JDK en junio de 2016 y es parte de Java9 en adelante. También hay un backport para Java8 que está en u202.

Lo que ves es realmente una advertencia del registrador interno del JDK. No es una excepción. Creo que la advertencia se puede ignorar de forma segura ... a menos que el código de usuario realmente quiera las preferencias del sistema, pero eso es muy raro.

Información adicional

El error no se reveló en versiones anteriores a Java 1.7.21, porque hasta entonces el instalador de JRE crearía una clave de registro HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefspara usted y esto efectivamente ocultaría el error. Por otro lado, nunca se te ha requerido ejecutar un instalador para tener un JRE en tu máquina, o al menos esta no ha sido la intención de Sun / Oracle. Como sabrán, Oracle ha estado distribuyendo el JRE para Windows en .tar.gzformato durante muchos años.

Peter
fuente
Gracias por un análisis tan profundo. El número 8139507 , que mencionaste, dice que el error se solucionó en JDK 9.
realsonic
3
@realsonic. Sumado a eso: parece que Oracle finalmente logró respaldar esta solución. Se arregla en 8u202 . (a partir del 30 de septiembre de 2018, la última versión de Java 8 es u181, por lo que la solución es compatible pero aún no está en ninguna versión lanzada)
Peter
30

Si alguien está tratando de resolver esto en una versión de Windows de 64 bits, es posible que deba crear la siguiente clave:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
walkern
fuente
9
Recibí este error al usar una JVM de 64 bits en Windows 7 de 64 bits, y la solución que propusieron Dennis y MKorsch funcionó bien para mí. Quizás la solución Wow6432Node sea para JVM de 32 bits en Windows de 64 bits.
Scott Johnson
7

El problema es que la consola simple no puede editar el registro. No es necesario editar el registro a mano, solo inicie el groovysharchivo una vez con privilegios administrativos. Todos los lanzamientos posteriores funcionan sin error.

Serpiente Oscura
fuente
2
Gracias, sugeriría a otros que prueben esto, es la solución más simple :)
Aditya T
1
La respuesta más fácil debería estar en la parte superior. Tenía esta advertencia ejecutando pruebas de JMeter, pero comencé una vez que jmeter.bat como Administrador y la advertencia desapareció.
KB
2

Tuve un problema similar al iniciar apache jmeter en 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.

Utilizó con éxito la solución Dennis Traub, con explicaciones de Mkorsch. O puede crear un archivo con la extensión "reg" y escribir en él lo siguiente:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... luego ejecútalo.

razvanone
fuente
1

Recibía el siguiente mensaje:

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

y desapareció después de crear una de estas claves de registro, la mía es de 64 bits, así que probé solo eso.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

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

Esto me paso a mi.

Aparentemente es porque Java no tiene permiso para crear claves de registro.

Consulte: Java: java.util.Preferences Failing

Wolsie
fuente
Bueno, más precisamente es porque hay un error en el JDK. Vea la respuesta aceptada en el enlace en su respuesta.
Peter
Realmente no es un error: la configuración de toda la máquina solo se permite a los usuarios administradores de la máquina. Úselo runaspara ejecutar su aplicación como usuario administrador local y felizmente creará la clave de registro bajo HKLM. Lo que Java no tiene es un mecanismo para pedir permisos elevados (es decir, idealmente habría invocado Windows UAC en lugar de fallar; es cuestionable si esa es una idea universalmente buena).
ddimitrov
0

El problema es de hecho la clave de registro que falta. Se puede crear manualmente

O

se puede crear de forma automática ejecutando el programa como administrador una vez. Eso le dará al programa los permisos requeridos, y cuando se ejecute normalmente, seguirá funcionando correctamente.

Alessandro Roaro
fuente