Bu aslında bir JDK hatası. Yıllar boyunca birkaç kez rapor edildi, ancak yalnızca 8139507'de Oracle tarafından ciddiye alındı.
Sorun için JDK kaynak kodunda idi WindowsPreferences.java
. Bu sınıfta, her iki düğüm userRoot
ve systemRoot
statik olarak şu şekilde bildirildi:
/**
* 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);
Bu, sınıfa ilk kez başvurulduğunda her iki statik değişkenin başlatılacağı ve bu durumda HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= sistem ağacı) için Kayıt Defteri Anahtarı henüz oluşturulmamışsa oluşturulmaya çalışılacağı anlamına gelir.
Bu nedenle, kullanıcı kendi kodunda her türlü önlemi alıp sistem ağacına hiç dokunmadıysa veya referansta bulunmasa bile, JVM aslında başlatmaya çalışarak systemRoot
uyarıya neden olur. İlginç bir ince böcek.
Haziran 2016'da JDK kaynağına adanmış bir düzeltme var ve bu, Java9'dan itibaren bir parçası. Ayrıca u202'de bulunan Java8 için bir backport var .
Gördüğünüz şey gerçekten JDK'nın dahili kaydedicisinden bir uyarı. Bu bir istisna değildir. Kullanıcı kodu gerçekten sistem tercihlerini istemedikçe uyarı güvenli bir şekilde göz ardı edilebilir inanıyorum, ama bu çok nadiren durum.
Bonus bilgisi
Hata, Java 1.7.21'den önceki sürümlerde kendini göstermedi, çünkü o zamana kadar JRE yükleyicisi HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
sizin için Kayıt Defteri anahtarı oluşturacak ve bu da hatayı etkili bir şekilde gizleyecektir. Öte yandan, makinenizde bir JRE olması için hiçbir zaman bir yükleyici çalıştırmanız gerekmedi veya en azından bu Sun / Oracle'ın amacı değildi. Bildiğiniz gibi Oracle, Windows için JRE'yi .tar.gz
yıllardır formatta dağıtıyor .