Це насправді помилка JDK. Повідомлялося , кілька разів на протязі багатьох років, але тільки в 8139507 було нарешті прийнято всерйоз Oracle.
Проблема була у вихідному коді JDK для WindowsPreferences.java
. У цьому класі обидва вузли userRoot
та systemRoot
були оголошені статичними як у:
/**
* 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);
Це означає, що при першому посиланні на клас обидва статичні змінні будуть ініційовані, і цим HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
буде спроба створити Ключ реєстру для (= системного дерева), якщо він ще не існує.
Тож навіть якщо користувач вжив будь-яких запобіжних заходів у власному коді і ніколи не торкався або посилався на системне дерево, то JVM насправді все-таки намагатиметься інстанціювати systemRoot
, тим самим викликаючи попередження. Це цікава тонка помилка.
Існує виправлення, пов’язане з джерелом JDK в червні 2016 року, і воно є частиною Java9. Там також перенести для Java8 , який знаходиться в U202.
Те, що ви бачите, насправді є попередженням із внутрішнього реєстратора JDK. Це не виняток. Я вважаю, що попередження можна сміливо ігнорувати .... якщо тільки код користувача справді не бажає системних налаштувань, але це дуже рідко.
Інформація про бонус
Помилка не виявила себе у версіях до Java 1.7.21, оскільки до цього часу інсталятор JRE створив HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
для вас ключ реєстру, і це фактично приховало б помилку. З іншого боку, вам ніколи не потрібно було запускати інсталятор, щоб мати JRE на вашій машині, або, принаймні, це не було наміром Sun / Oracle. Як вам відомо, Oracle вже .tar.gz
багато років розповсюджує JRE для Windows у форматі.