Il s'agit en fait d'un bogue JDK. Il a été rapporté à plusieurs reprises au fil des ans, mais ce n'est qu'en 8139507 qu'il a finalement été pris au sérieux par Oracle.
Le problème était dans le code source JDK pour WindowsPreferences.java
. Dans cette classe, les deux nœuds userRoot
et systemRoot
ont été déclarés statiques comme dans:
/**
* 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);
Cela signifie que la première fois que la classe est référencée, les deux variables statiques seront lancées et que la clé de registre pour HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= arborescence système) sera tentée d'être créée si elle n'existe pas déjà.
Ainsi, même si l'utilisateur a pris toutes les précautions dans son propre code et n'a jamais touché ou référencé l'arborescence du système, alors la JVM essaierait encore de s'instancier systemRoot
, provoquant ainsi l'avertissement. C'est un bug subtil intéressant.
Il y a un correctif appliqué à la source JDK en juin 2016 et il fait partie de Java9 et des versions ultérieures. Il existe également un backport pour Java8 qui se trouve dans u202.
Ce que vous voyez est vraiment un avertissement de l'enregistreur interne du JDK. Ce n'est pas une exception. Je crois que l'avertissement peut être ignoré en toute sécurité ... à moins que le code utilisateur ne veuille effectivement les préférences du système, mais c'est très rarement le cas.
Info bonus
Le bogue ne s'est pas révélé dans les versions antérieures à Java 1.7.21, car jusque-là, le programme d'installation JRE créait la clé de registre HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
pour vous, ce qui masquerait efficacement le bogue. D'un autre côté, vous n'avez jamais vraiment été obligé d'exécuter un programme d'installation pour avoir un JRE sur votre machine, ou du moins cela n'a pas été l'intention de Sun / Oracle. Comme vous le savez peut-être, Oracle distribue le JRE pour Windows au .tar.gz
format depuis de nombreuses années.