이것은 실제로 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 년 6 월 JDK 소스에 대한 수정 사항이 있으며 Java9 이후 버전입니다. u202에있는 Java8에 대한 백 포트 도 있습니다 .
당신이 보는 것은 실제로 JDK의 내부 로거의 경고입니다. 예외는 아닙니다. 사용자 코드가 실제로 시스템 환경 설정을 원하지 않는 한 경고를 안전하게 무시할 수 있다고 생각하지만 그 경우는 거의 없습니다.
보너스 정보
Java 1.7.21 이전의 버전에서는 버그가 나타나지 않았습니다. 그때까지 JRE 설치 프로그램이 레지스트리 키 HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
를 작성 하여 버그를 효과적으로 숨길 수 있기 때문 입니다. 반면에 시스템에 JRE를 설치하기 위해 설치 프로그램을 실행하지 않아도되거나 최소한 Sun / Oracle의 의도는 아닙니다. 아시다시피, Oracle은 JRE for Windows .tar.gz
를 몇 년 동안 형식 으로 배포 해 왔습니다.