194 votes

Avertissement du shell Groovy "Impossible d'ouvrir/créer le nœud racine de prefs...".

J'ai essayé d'ouvrir le Shell Groovy ( 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 avoir imprimé le message ci-dessus, le shell a démarré comme prévu.

3 votes

1 votes

Préférences enregistrées dans un fichier en tant que magasin de soutien devrait éviter complètement la question. Il existe des situations où le fait de compter sur les utilisateurs finaux pour changer leur registre abominable n'est pas une solution viable.

2 votes

C'est un bogue Java connu qui existe toujours sur Windows 10 et la mise à jour 112. Il suffit d'exécuter le programme une fois à partir d'une invite élevée et il disparaît.

335voto

MKorsch Points 747

La réponse de Dennis est correcte. Cependant, je voudrais expliquer la solution d'une manière un peu plus détaillée (pour les utilisateurs de Windows) :

  1. Allez dans votre menu Démarrer et tapez regedit dans le champ de recherche.
  2. Naviguer vers le chemin HKEY_LOCAL_MACHINE\Software\JavaSoft (Windows 10 semble désormais disposer de cette fonction : HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft )
  3. Cliquez à droite sur le dossier JavaSoft et cliquez sur New -> Key
  4. Nommez la nouvelle clé Prefs et tout devrait fonctionner.

Alternativement, enregistrez et exécutez un *.reg avec le contenu suivant :

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]

8 votes

Est-il possible de le faire de manière progressive ?

1 votes

Probablement pas facilement, car cela nécessite des privilèges d'administrateur, du moins dans les environnements d'entreprise avec un domaine Active Directory configuré. La lecture des préférences dans HKEY_CURRENT_USER au lieu de HKEY_LOCAL_MACHINE pourrait toutefois fonctionner.

13 votes

Je peux confirmer que cela ne fonctionnera pas si cela est fait sous HKEY_CURRENT_USER. Une meilleure question : pourquoi diable un produit basé sur Java s'attache-t-il au registre Windows ?

75voto

Dennis Traub Points 24186

J'ai pu résoudre le problème en créant manuellement la clé de registre suivante :

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

0 votes

Pourriez-vous me dire le processus exact ? Je travaille principalement sur Mac mais j'obtiens cette erreur lorsque j'exécute mon programme sur Windows et j'aimerais savoir comment la corriger.

14 votes

Je vois ça sur les logiciels que nous vendons. Un correctif automatique/programmatique serait mieux si vous en avez un aussi. Dire à mes utilisateurs finaux de sauter dans regedit est une perspective effrayante. Existe-t-il un moyen de faire en sorte que Java le fasse automatiquement sous Windows 8.1 (qui est la seule plateforme sur laquelle je vois l'erreur) ?

0 votes

L'erreur se produit également sous Windows 10, et cette solution a fonctionné.

48voto

nolan6000 Points 1511

Il s'agit en fait d'un bug du JDK. Il a été signalé à plusieurs reprises au cours des années, mais uniquement dans le cadre de 8139507 a finalement été pris au sérieux par Oracle.

Le problème se trouvait dans le code source du JDK pour WindowsPreferences.java . Dans cette classe, les deux nœuds userRoot y 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 Les variables statiques seraient lancées et, de ce fait, la clé de registre pour les variables statiques serait créée. HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs (= arbre système) sera tenté d'être créé s'il 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'arbre système, la JVM essaiera toujours d'instancier systemRoot ce qui a provoqué l'avertissement. Il s'agit d'un bug subtil et intéressant.

Un correctif a été intégré aux sources du JDK en juin 2016 et fait partie intégrante de Java9. Il y a aussi un backport pour Java8 qui est en u202.

Ce que vous voyez est en fait un avertissement du logger interne du JDK. Il ne s'agit pas d'une exception. Je pense que l'avertissement peut être ignoré sans risque .... à moins que le code utilisateur ne veuille effectivement les préférences du système, mais c'est très rarement le cas.

Infos bonus

Le bogue ne s'est pas révélé dans les versions antérieures à Java 1.7.21, car jusqu'à cette date, le programme d'installation du JRE créait une clé de Registre HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs pour vous et cela cacherait efficacement le bug. D'autre part, il n'a jamais été nécessaire d'exécuter un programme d'installation pour avoir un JRE sur votre machine, ou du moins ce n'était pas l'intention de Sun/Oracle. Comme vous le savez peut-être, Oracle a distribué le JRE pour Windows en .tar.gz depuis de nombreuses années.

32voto

walkern Points 71

Si vous essayez de résoudre ce problème sur une version 64 bits de Windows, vous devrez peut-être créer la clé suivante :

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9 votes

J'ai eu cette erreur en utilisant une JVM 64 bits sur Windows 7 64 bits, et la solution proposée par Dennis et MKorsch a bien fonctionné pour moi. Peut-être que la solution Wow6432Node est destinée aux JVM 32 bits sur Windows 64 bits.

8voto

Darksnake Points 106

Le problème est que la console simple ne peut pas modifier le registre. Il n'est pas nécessaire d'éditer le registre à la main, il suffit de lancer l'application groovysh une fois avec des privilèges administratifs. Tous les lancements suivants fonctionnent sans erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X