La lecture et l'écriture de/vers les préférences Java échouent sur Windows 8 frais,


J'ai une application Java qui lit à partir du {[2] } en utilisant:

Preferences prefs = Preferences.userNodeForPackage(MyClass.class);
prefs.get((String)key, "");

Sur une nouvelle machine Windows 8, cela échoue avec:

WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs 
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

Le code d'erreur 5 est accès refusé.

Je ne trouve rien que je fais mal. Les recherches Google et SO donnent d'anciens résultats relatifs uniquement à Windows Vista/7 où l'on utilisait à tort systemRoot (Comment puis-je écrire des préférences système avec Java? Puis-je invoquer l'UAC?).

L'erreur peut être "corrigée" en créant HKLM / Software / JavaSoft / Prefs et définir les autorisations sur HKLM/Software / JavaSoft comme mentionné ici Java: java.util.Les préférences échouent. Mais ce n'est pas quelque chose que je peux exiger de mes utilisateurs lorsqu'ils installent le programme.

Donc je cherche une meilleure solution. Mon dernier effort consiste simplement à écrire dans un fichier mais Je voudrais éviter cela. Cela semble également lié J'essaie d'utiliser des Prefences Java à partir de XML SANS utiliser le registre Windows, mais je vois un Message lié au registre mais il a été rejeté sans réponse.

À l'heure actuelle, je soupçonne un bogue Win8 JVM...

Questions

  • quelqu'un connais une solution qui n'implique pas l'écriture de fichiers?
  • Pourquoi le même code fonctionne parfaitement bien sous Windows 7, mais échoue lamentablement dans Windows 8?
Author: Community, 2013-09-01

1 answers

J'ai récemment commencé à remarquer un même avertissement et j'ai pensé que cela signifie que le registre ne peut pas être écrit. Mais en y regardant de plus près, j'ai remarqué que toutes les préférences étaient mises à jour avec succès dans HKEY_CURRENT_USER de toute façon. Je suis donc curieux de savoir pourquoi je vois cet avertissement.

Il s'est avéré que le coupable est cette variable membre statique: WindowsPreferences.SystemRoot

On dirait que Java essaie d'initialiser WindowsPreferences.SystemRoot juste au cas où il serait utilisé plus tard par le programme, et cette initialisation échoue évidemment si le programme n'est pas exécuté en tant qu'administrateur.

Puisque vous utilisez les préférences.userNodeForPackage (), vous n'aurez jamais besoin de SystemRoot, vous pouvez donc ignorer cet avertissement en toute sécurité.

Bien sûr, c'est une pratique horrible que Java essaie d'initialiser SystemRoot quand ce n'est pas demandé.

Mise à jour: J'ai testé ce problème dans diverses versions de Java et j'ai conclu que ce bogue avait été introduit dans Java 1.7.0_21. Cela a bien fonctionné dans Java 1.7.0_17 simplement parce que le programme d'installation de cette version créerait le dossier "Pref" dans le registre! Bien sûr, même dans cette version, si vous deviez supprimer "Pref" du registre, cela cesserait de fonctionner, donc c'était une solution stupide de la part d'Oracle pour commencer. Je vais remplir un rapport de bogue.

Mise à jour 2: Le message d'avertissement n'est pas un bogue. Cela semble être le comportement prévu: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6809488

 12
Author: Saeid Nourian, 2014-05-21 14:07:20