Java: java.util.Preferences Failing

Unfortunately most of the answers you got here are wrong … at least slightly. In the sense that the symptom is being treated, not the cause.

Let’s recap. Java Preferences has two “trees”: the user tree and the system tree. You can write your own backend to Java Preferences (called a backing store) but few developers do, so you end up with the JDK’s default backing store. On a Windows platform this means the Win Registry, more specifically:

  • The user tree is written into HKEY_CURRENT_USER\Software\JavaSoft\Prefs (the OS user always has write access here)
  • The system tree is written into HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs (only an OS user with admin privs has write access here)

In summary: As long as your code doesn’t attempt to use the system tree, you should be fine and shouldn’t need to mess with assigning privileges at the OS level. The system tree is meant for “all users on the host” and the user tree is meant for the specific logged-in user. In your case I’m confident you can suffice with the user tree, so that is really your solution. Don’t go messing with privileges, running as Administrator, and what not.

…. but there’s more. Suppose your code deliberately doesn’t touch the Java Preferences system tree, as instructed. You’ll then still see this warning on Windows:

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

So what is going on? Did I give you the wrong advice ? Not really. Stay with me.

Diving into the JDK source code you’ll see that 0x80000002 means HKLM, i.e. the place in the Win Registry that shouldn’t be touched. Your code never references the system tree and yet you still see this warning !?? (At this point you must be ripping all your hair out … as I did)

Well, this is one of the rare occasions where there really is a JDK bug. You can read more about it in this answer by me which I encourage you to read if you are interested in why subtle bugs can go undetected in the JDK for years. The bug has existed ever since JDK 1.4 but has only recently been fixed and not yet backported to JDK 8 (update: the fix has now been backported to version 8u192 onwards of the JDK)

Best advice

  • Make sure your code only references the user tree, not the system tree. It is only fair that the OS requires all kinds of privs for you to write to a system-wide location. If you really need to write into such a location then there really is no other solution than assigning privs, executing as Administrator or what not.

  • Ignore the warning. It’ll go away once you are on Java 8 update 192 or later. The warning can be safely ignored.

  • Alternatively you can try to programmatically silence the warning. It comes from the JDK’s Platform Logger, so something like this should work, albeit I haven’t tried it myself:

      sun.util.logging.PlatformLogger platformLogger = PlatformLogger.getLogger("java.util.prefs");
      platformLogger.setLevel(PlatformLogger.Level.OFF);
    

Leave a Comment