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 userRoot
y systemRoot
se 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\Prefs
para 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.gz
formato durante muchos años.