Avertissement Groovy Shell "Impossible d'ouvrir / créer le nœud racine prefs…"

188

J'ai essayé d'ouvrir Groovy Shell ( groovysh) sur Windows 8 et j'ai obtenu la sortie suivante:

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.

Dennis Traub
la source
3
Cela est dû à un bug: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck
1
Les préférences enregistrées dans un fichier en tant que magasin de sauvegarde devraient éviter complètement le problème. Il y a des situations où le fait de compter sur les utilisateurs finaux pour changer leur registre abominable n'est pas une solution viable.
Dave Jarvis
2
C'est un bogue Java connu toujours présent sur Windows 10 et la mise à jour 112. Exécutez simplement le programme une fois à partir d'une invite élevée et il disparaît.
david.pfx

Réponses:

328

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

  1. Allez dans votre menu Démarrer et tapez regeditdans le champ de recherche.
  2. Accédez au chemin HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 semble avoir maintenant ce ici: HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft)
  3. Faites un clic droit sur le dossier JavaSoft et cliquez sur New->Key
  4. Nommez la nouvelle clé Prefset tout devrait fonctionner.

Vous pouvez également enregistrer et exécuter un *.regfichier avec le contenu suivant:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
MKorsch
la source
7
Est-il possible de le faire de manière progressive?
facetoe
12
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 se lie-t-il au registre Windows?
avgvstvs
5
Il n'est pas possible pour une application grand public d'obliger l'utilisateur à jouer avec le registre. Pourquoi Java met-il toujours en œuvre des demi-solutions comme celle-ci?
El Mac
15
Mon installation de Windows 10 a les deux chemins clés indiqués ci-dessus, la correction de mon installation a nécessité l'ajout des préférences à HKEY_LOCAL_MACHINE \ Software \ JavaSoft et non à HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124
2
Sur Windows 10, le bon emplacement pour le dossier Perfs est toujoursHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur
72

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

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Dennis Traub
la source
Pourriez-vous me dire le processus exact? Je travaille principalement sur Mac mais j'obtiens cette erreur lorsque j'exécute mon programme sous Windows et j'aimerais savoir comment y remédier.
Meshulam Silk
14
Je vois cela sur les logiciels que nous vendons. Une solution automatique / programmatique serait préférable si vous en avez également une. Dire à mes utilisateurs finaux de se lancer dans regedit est une perspective effrayante. Existe-t-il un moyen de faire en sorte que Java le fasse automatiquement sur Windows 8.1 (qui est la seule plate-forme sur laquelle je vois l'erreur).
Brian Knoblauch
Une erreur se produit également dans Windows 10 et ce correctif a fonctionné
TriumphST
45

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 userRootet systemRootont é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\Prefspour 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.gzformat depuis de nombreuses années.

Peterh
la source
Merci pour une analyse aussi approfondie. Le problème 8139507 , que vous avez mentionné, indique que le bogue est corrigé dans JDK 9.
realsonic
3
@realsonic. Ajoutant à cela: il semble qu'Oracle ait finalement réussi à rétroporter ce correctif. Il est corrigé dans 8u202 . (à compter du 30 septembre 2018, la dernière version de Java 8 est u181, le correctif est donc rétroporté mais pas encore dans aucune version publiée)
Peterh
30

Si quelqu'un essaie 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
walkern
la source
9
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 très bien fonctionné pour moi. Peut-être que la solution Wow6432Node est destinée aux JVM 32 bits sur Windows 64 bits.
Scott Johnson
7

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 groovyshune fois avec les privilèges administratifs. Tous les lancements ultérieurs fonctionnent sans erreur.

Couleuvre obscure
la source
2
Merci, je suggérerais aux autres d'essayer ceci, c'est la solution la plus simple :)
Aditya T
1
La réponse la plus simple, devrait être en haut J'ai eu cet avertissement en exécutant des tests JMeter, mais j'ai commencé une fois le jmeter.bat en tant qu'administrateur et l'avertissement est parti.
KB
2

A eu un problème similaire lors du démarrage d'Apache jmeter sur Windows 8 64 bits:

[]apache-jmeter-2.13\bin>jmeter
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.

Solution Dennis Traub utilisée avec succès, avec les explications de Mkorsch. Ou vous pouvez créer un fichier avec l'extension "reg" et y écrire ce qui suit:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... puis exécutez-le.

razvanone
la source
1

Je recevais le message suivant:

Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002

et il était parti après avoir créé l'une de ces clés de registre, la mienne est 64 bits, donc j'ai essayé seulement cela.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Sohail Ahmed
la source
1

Cela 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.Preferences Failing

Wolsie
la source
Eh bien, plus précisément, c'est parce qu'il y a un bogue dans le JDK. Voir la réponse acceptée sur le lien dans votre réponse.
peterh
Ce n'est pas vraiment un bogue - les paramètres à l'échelle de la machine ne sont autorisés qu'aux utilisateurs administrateurs de la machine. Utilisez runaspour exécuter votre application en tant qu'utilisateur administrateur local et il créera avec plaisir la clé de registre sous HKLM. Ce que Java n'a pas, c'est un mécanisme pour demander des autorisations élevées (c'est-à-dire que, idéalement, il aurait appelé l'UAC Windows au lieu d'échouer - il est douteux que ce soit une bonne idée universellement).
ddimitrov
0

Le problème est en effet la clé de registre qui manque. Il peut être créé manuellement

OU

il peut être créé automatiquement en exécutant le programme en tant qu'administrateur une fois. Cela donnera au programme les autorisations requises, et quand il sera exécuté normalement, il fonctionnera toujours correctement.

Alessandro Roaro
la source