Este é realmente um bug do JDK. Foi relatado várias vezes ao longo dos anos, mas somente em 8139507 foi finalmente levado a sério pela Oracle.
O problema estava no código fonte do JDK para WindowsPreferences.java
. Nesta classe, ambos os nós userRoot
e systemRoot
foram declarados estáticos como em:
/**
* 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);
Isso significa que, na primeira vez em que a classe for referenciada, ambas as variáveis estáticas seriam iniciadas e, com isso, a Chave do Registro para HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= árvore do sistema) tentará ser criada se ela ainda não existir.
Portanto, mesmo que o usuário tome todas as precauções em seu próprio código e nunca toque nem faça referência à árvore do sistema, a JVM ainda tentará instanciar systemRoot
, causando o aviso. É um bug sutil interessante.
Há uma correção confirmada na fonte JDK em junho de 2016 e faz parte do Java9 em diante. Há também um backport para Java8 que está no u202.
O que você vê é realmente um aviso do registrador interno do JDK. Não é uma exceção. Acredito que o aviso possa ser ignorado com segurança .... a menos que o código do usuário esteja realmente querendo as preferências do sistema, mas esse raramente é o caso.
Informações sobre bônus
O bug não se revelou nas versões anteriores ao Java 1.7.21, porque até então o instalador do JRE criaria a chave do Registro HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
para você e isso ocultaria efetivamente o bug. Por outro lado, você nunca foi realmente solicitado a executar um instalador para ter um JRE em sua máquina, ou pelo menos essa não foi a intenção da Sun / Oracle. Como você deve saber, a Oracle distribui o JRE para Windows em .tar.gz
formato há muitos anos.