Groovy Coquille d'alerte “impossible d'ouvrir/créer préf nœud racine ...”
J'ai essayé d'ouvrir le Groovy Shell (groovysh
) sur Windows 8 et j'ai obtenu le résultat suivant:
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.
Après l'impression, le message ci-dessus, la coque a commencé comme prévu.
- Cela est dû à un bug: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
- Préférences enregistrées dans un fichier en tant que magasin de sauvegarde devrait éviter le problème entièrement. Il y a des situations où de compter sur les utilisateurs à modifier leur abominable registre n'est pas une solution viable.
- C'est un bug de Java toujours autour de WIndows 10 et de mise à jour de 112. Il suffit d'exécuter le programme à partir d'une élévation rapide et il s'en va.
Vous devez vous connecter pour publier un commentaire.
Dennis réponse est correcte. Cependant, je tiens à expliquer la solution un peu plus en détail (pour les Utilisateurs Windows):
regedit
dans le champ de recherche.HKEY_LOCAL_MACHINE\Software\JavaSoft
(Windows 10 semble maintenant avoir ce ici:HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
)New
->Key
Prefs
et tout devrait fonctionner.Sinon, enregistrer et exécuter une
*.reg
fichier avec le contenu suivant:HKEY_LOCAL_MACHINE\Software\JavaSoft
J'ai été en mesure de résoudre le problème en créant manuellement la clé de registre suivante:
C'est en fait un JDK bug. Il a été rapporté à plusieurs reprises au fil des ans, mais seulement dans Huit million cents trente neuf mille cinq cent sept était-il enfin pris au sérieux par Oracle.
Le problème était dans le JDK code source pour
WindowsPreferences.java
. Dans cette classe, les deux nœudsuserRoot
etsystemRoot
ont été déclarées statiques comme dans:Cela signifie que la première fois que la classe est référencé les deux variables statiques serait à l'initiative et par ce la Clé de Registre pour
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= système d'arbre) sera tenté d'être créée si elle n'existe pas déjà.Même si l'utilisateur a pris toutes les précautions en son propre code et n'a jamais touché ou la référence de l'arborescence du système, puis la JVM serait en fait toujours essayer d'instancier
systemRoot
, ce qui provoque le message d'avertissement. Il est intéressant de bug subtil.Il y a un correctif engage à le JDK source en juin 2016, et il est une partie de Java9 partir. Il y a aussi un backport pour Java8 qui est en u202.
Ce que vous voyez est vraiment un avertissement de la JDK interne de l'enregistreur. Ce n'est pas une exception. Je crois que l'avertissement peut être ignoré en toute sécurité .... à moins que le code de l'utilisateur est, en effet, de vouloir les préférences système, mais qui est très rarement le cas.
Bonus info
Le bug n'a pas révélé lui-même dans les versions antérieures de Java 1.7.21, parce que jusqu'alors, le programme d'installation JRE serait de créer la clé de Registre
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
pour vous et ce serait effectivement masquer le bug. D'autre part, vous n'avez jamais vraiment été nécessaires pour exécuter un programme d'installation afin d'avoir un JRE sur votre machine, ou au moins, ce n'est pas Sun/Oracle intention. Comme vous le savez Oracle a été la distribution de la JRE pour Windows dans.tar.gz
format pour de nombreuses années.Si quelqu'un tente de résoudre ce sur une version 64 bits de Windows, vous pourriez avoir besoin pour créer la clé suivante:
Le problème est qu'une simple console ne peut pas modifier le registre. Pas besoin de modifier le registre à la main, il suffit de lancer le
groovysh
une fois avec des privilèges administratifs. Tous les lancements de travail sans erreur.A eu un problème similaire lors du démarrage d'apache jmeter sur windows 8 64 bits:
Utilisé avec succès Dennis Traub solution, avec Mkorsch explications. Ou vous pouvez créer un fichier avec l'extension "reg" et d'écrire dans ce qui suit:
... puis l'exécuter.
J'ai été faire passer le message suivant:
et il a disparu après la création de l'une de ces clés de registre, le mien est en 64 bits, donc j'ai essayé seulement.
Ce qui m'est arrivé.
Apparemment c'est parce que Java n'a pas l'autorisation de créer des clés de registre.
Voir: Java: java.util.Préférences Défaut
Le problème est en effet la clé de registre qui est manquant. Il peut être créé manuellement
OU
il peut être créé automatiquement par l'exécution du programme en tant qu'administrateur une fois. Que va donner le programme les autorisations requises, et quand il va être exécuté en tant normal, il continuera à fonctionner correctement.