Это на самом деле ошибка 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
, тем самым вызывая предупреждение. Это интересная тонкая ошибка.
В июне 2016 года исправлено право на источник JDK. Будет интересно посмотреть, будет ли он включен в Java 8.
Что вы см. на самом деле предупреждение от внутреннего регистратора JDK. Это не исключение. Я считаю, что предупреждение можно смело игнорировать ... если код пользователя действительно не хочет системных предпочтений, но это очень редко.
Ошибка не отображалась в версиях до Java 1.7.21, потому что до этого установщик JRE создавал для вас ключ реестра HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
, и это эффективно скрыть ошибку. С другой стороны, вам никогда не требовалось запускать установщик, чтобы иметь JRE на вашей машине, или, по крайней мере, это не было намерением Sun / Oracle. Как вам известно, Oracle много лет распространяет JRE для Windows в формате .tar.gz
.
Таким образом, чтобы сделать это, если сделать переменную секретной, вы не сможете получить к ней доступ напрямую из любого сценария. То, что я делаю, - это то, что мне нужно, чтобы она расшифровывалась, это перейти в раздел переменных окружения задачи и ввести следующее.
Это расшифровывает переменную и устанавливает переменную с тем же именем, чтобы такие инструменты, как Terraform, могли получить к ней доступ.