[windows] Groovy Shell 경고 "prefs 루트 노드를 열거 나 만들 수 없습니다 ..."



Answers

수동으로 다음 레지스트리 키를 만들어 문제를 해결할 수있었습니다.

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Question

Windows 8에서 Groovy Shell ( groovysh )을 열려고 시도하고 다음과 같은 결과가 나타납니다.

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

위의 메시지를 인쇄 한 후 쉘이 예상대로 시작되었습니다.




윈도우 8 64 비트에서 아파치 jmeter를 시작할 때 비슷한 문제가 있었다 :

[]apache-jmeter-2.13\bin>jmeter
java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs     at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

Mkorsch 설명과 함께 Dennis Traub 솔루션을 성공적으로 사용했습니다. 또는 확장명이 "reg"인 파일을 만들어 다음 내용을 쓸 수 있습니다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... 그런 다음 실행하십시오.







이것은 실제로 JDK 버그입니다. 수년에 걸쳐 여러 번보고되었지만 오라클이 마침내 8139507 에서 심각하게 받아 들였습니다.

문제는 WindowsPreferences.java 의 JDK 소스 코드에 있습니다. 이 클래스에서 userRootsystemRoot 노드는 다음과 같이 static으로 선언되었습니다.

/**
 * 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 소스에 대한 수정이있었습니다. Java 8로 백 포트되는지 여부는 흥미로울 것입니다.

JDK의 내부 로거로부터의 경고입니다. 예외는 아닙니다. 나는 경고가 무시 될 수 있다고 믿는다. .... 사용자 코드가 정말로 시스템 환경 설정을 원한다면 말이지 만, 아주 드문 경우이다.

보너스 정보

이 버그는 Java 1.7.21 이전 버전에서는 JRE 설치 프로그램이 레지스트리 키 HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs 를 만들었 기 때문에 버그를 효과적으로 숨길 수 있었기 때문에 자체적으로 밝혀지지 않았습니다. 반면에 JRE를 시스템에 설치하기 위해 설치 프로그램을 실행해야하거나 적어도 Sun / Oracle의 의도는 아닙니다. 아시다시피 오라클은 수년 동안 .tar.gz 형식의 Windows 용 JRE를 배포 해 왔습니다.




Related