Groovy Shell warning“ ไม่สามารถเปิด / สร้างโหนดรูทของ prefs …”


188

ฉันพยายามเปิด Groovy Shell ( groovysh) บน Windows 8 และได้รับผลลัพธ์ต่อไปนี้:

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.

หลังจากพิมพ์ข้อความข้างต้นเชลล์ก็เริ่มทำงานตามที่คาดไว้


3
นี่เป็นเพราะมีข้อผิดพลาด: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck

1
ค่ากำหนดที่บันทึกไว้ในไฟล์เป็นที่เก็บข้อมูลสำรองควรหลีกเลี่ยงปัญหาทั้งหมด มีบางสถานการณ์ที่การพึ่งพาผู้ใช้ปลายทางเพื่อเปลี่ยนรีจิสทรีที่น่ารังเกียจไม่ใช่วิธีแก้ปัญหา
Dave Jarvis

2
มันเป็นบั๊ก Java ที่รู้จักกันดีที่ยังคงอยู่ใน WIndows 10 และอัปเดต 112 เพียงรันโปรแกรมหนึ่งครั้งจากพรอมต์ที่ยกระดับและมันจะหายไป
david.pfx

คำตอบ:


328

คำตอบของเดนนิสนั้นถูกต้อง อย่างไรก็ตามฉันต้องการอธิบายวิธีแก้ปัญหาในรายละเอียดเพิ่มเติมเล็กน้อย (สำหรับผู้ใช้ Windows):

  1. ไปที่เมนู Start แล้วพิมพ์regeditลงในช่องค้นหา
  2. นำทางไปยังเส้นทางHKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 ดูเหมือนว่าตอนนี้มีที่นี่: HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft)
  3. คลิกขวาที่โฟลเดอร์ JavaSoft และคลิกที่New->Key
  4. ตั้งชื่อคีย์ใหม่Prefsและทุกอย่างจะทำงานได้

อีกทางหนึ่งให้บันทึกและเรียกใช้*.regไฟล์ด้วยเนื้อหาดังต่อไปนี้:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]

7
เป็นไปได้ไหมที่จะทำสิ่งนี้อย่างเป็นทางการ?
facetoe

12
ฉันสามารถยืนยันได้ว่าจะไม่ทำงานหากดำเนินการภายใต้ HKEY_CURRENT_USER คำถามที่ดีกว่าทำไมบนโลกนี้คือผลิตภัณฑ์ที่ใช้ Java เป็นตัวเชื่อมโยงกับ Windows Registry
avgvstvs

5
เป็นไปไม่ได้ที่แอพพลิเคชั่นสำหรับผู้ใช้จะกำหนดให้ผู้ใช้ไปเล่นสกีกับสตรี ทำไม Java จึงใช้งานโซลูชั่นแบบครึ่งเดียวเสมอ
El Mac

15
การติดตั้ง Windows 10 ของฉันมีทั้งพา ธ คีย์ที่ระบุไว้ด้านบนการแก้ไขการติดตั้งของฉันต้องเพิ่มการตั้งค่าไปที่ HKEY_LOCAL_MACHINE \ Software \ JavaSoft ไม่ใช่ HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124

2
ใน Windows 10 ยังคงตำแหน่งที่เหมาะสมสำหรับโฟลเดอร์ Perfs คือHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur

72

ฉันสามารถแก้ไขปัญหาด้วยการสร้างรีจิสตรีคีย์ต่อไปนี้:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

คุณช่วยบอกกระบวนการที่ถูกต้องให้ฉันได้ไหม ฉันทำงานบน Mac เป็นส่วนใหญ่ แต่ฉันได้รับข้อผิดพลาดนี้เมื่อฉันเรียกใช้โปรแกรมบน Windows และฉันต้องการทราบวิธีการแก้ไข
Meshulam Silk

14
ฉันเห็นสิ่งนี้ในซอฟต์แวร์ที่เราขาย การแก้ไขอัตโนมัติ / การเขียนโปรแกรมจะดีกว่าถ้าคุณมีหนึ่งในนั้นด้วย การบอกผู้ใช้ของฉันให้เข้าสู่ regedit เป็นโอกาสที่น่ากลัว มีวิธีที่จะทำให้ Java ทำสิ่งนี้โดยอัตโนมัติบน Windows 8.1 หรือไม่ซึ่งเป็นแพลตฟอร์มเดียวที่ฉันเห็นข้อผิดพลาด
Brian Knoblauch

เกิดข้อผิดพลาดใน Windows 10 เช่นกันและการแก้ไขนี้ใช้งานได้
TriumphST

45

นี่เป็นข้อบกพร่องของ JDK มีการรายงานหลายครั้งในช่วงหลายปีที่ผ่านมา แต่มีเพียง8139507เท่านั้นที่ทำให้ออราเคิลดำเนินการอย่างจริงจัง

WindowsPreferences.javaปัญหาก็คือในซอร์สโค้ดสำหรับ JDK ในคลาสนี้ทั้งสองโหนด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 ในเดือนมิถุนายน 2559 และเป็นส่วนหนึ่งของ Java9 เป็นต้นไป นอกจากนี้ยังมีbackportสำหรับ Java8 ซึ่งอยู่ใน u202

สิ่งที่คุณเห็นคือคำเตือนจากตัวบันทึกภายในของ JDK มันไม่ได้เป็นข้อยกเว้น ฉันเชื่อว่าคำเตือนสามารถเพิกเฉยได้อย่างปลอดภัย .... เว้นแต่ว่ารหัสผู้ใช้นั้นต้องการการตั้งค่าระบบ แต่ก็ไม่ค่อยเกิดขึ้น

ข้อมูลโบนัส

ข้อผิดพลาดไม่ได้เปิดเผยตัวเองในรุ่นก่อนหน้า Java 1.7.21 เนื่องจากจนถึงตัวติดตั้ง JRE จะสร้างคีย์รีจิสทรีHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsให้คุณและสิ่งนี้จะซ่อนข้อบกพร่องได้อย่างมีประสิทธิภาพ ในทางกลับกันคุณไม่จำเป็นต้องเรียกใช้ตัวติดตั้งเพื่อให้มี JRE ในเครื่องของคุณหรืออย่างน้อยก็ไม่ได้มีเจตนาของ Sun / Oracle ดังที่คุณอาจทราบว่า Oracle ได้แจกจ่าย JRE สำหรับ Windows ใน.tar.gzรูปแบบเป็นเวลาหลายปี


ขอบคุณสำหรับการวิเคราะห์ที่ลึกซึ้ง ปัญหา 8139507ที่คุณพูดถึงกล่าวว่าข้อผิดพลาดได้รับการแก้ไขใน JDK 9
realsonic

3
@realsonic การเพิ่มเข้าไป: ดูเหมือนว่าในที่สุดออราเคิลก็มีส่วนช่วยในการแก้ไขปัญหานี้ มันเป็นเรื่องที่แก้ไขใน 8u202 (ณ วันที่ 30S202018 รุ่นล่าสุดของ Java 8 คือ u181 ดังนั้นการแก้ไขจึงถูก backported แต่ยังไม่ได้อยู่ในรุ่นที่วางจำหน่าย)
peterh

30

หากใครพยายามแก้ปัญหานี้ใน Windows รุ่น 64 บิตคุณอาจต้องสร้างคีย์ต่อไปนี้:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
ฉันได้รับข้อผิดพลาดนี้ในขณะที่ใช้ JVM 64 บิตบน Windows 7 64 บิตและวิธีแก้ปัญหาที่ Dennis และ MKorsch เสนอนั้นใช้ได้ดีสำหรับฉัน บางทีโซลูชัน Wow6432Node อาจใช้กับ JVM แบบ 32 บิตบน Windows 64 บิต
Scott Johnson

7

ปัญหาคือคอนโซลธรรมดาไม่สามารถแก้ไขรีจิสทรี ไม่จำเป็นต้องแก้ไขรีจิสทรีด้วยตนเองเพียงแค่เปิดตัวgroovyshครั้งเดียวกับ priveleges บริหาร การเปิดตัวในภายหลังทั้งหมดจะทำงานโดยไม่มีข้อผิดพลาด


2
ขอบคุณผมจะแนะนำให้คนอื่น ๆ ที่จะลองนี้มันทางออกที่ง่ายที่สุด :)
Aditya T

1
คำตอบที่ง่ายที่สุดควรอยู่ด้านบนฉันมีคำเตือนนี้ในการดำเนินการทดสอบ JMeter แต่ฉันเริ่ม jmeter.bat ครั้งเดียวในฐานะผู้ดูแลระบบและคำเตือนหายไป
KB

2

มีปัญหาที่คล้ายกันเมื่อเริ่ม apache jmeter บน windows 8 64 บิต:

[]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.

ใช้โซลูชัน Dennis Traub สำเร็จด้วยคำอธิบาย Mkorsch หรือคุณสามารถสร้างไฟล์ที่มีนามสกุล "reg" และเขียนลงในไฟล์ต่อไปนี้:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... จากนั้นดำเนินการ


1

ฉันได้รับข้อความต่อไปนี้:

Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002

และมันก็หายไปหลังจากสร้างหนึ่งในรีจิสตรีคีย์เหล่านี้ฉันเป็น 64 บิตดังนั้นฉันจึงลองแค่นั้น

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

1

เรื่องนี้เกิดขึ้นกับฉัน

เห็นได้ชัดว่าเป็นเพราะ Java ไม่ได้รับอนุญาตให้สร้างรีจิสตรีคีย์

โปรดดู: Java: java.util.Preferences ล้มเหลว


แม่นยำมากขึ้นเพราะมีข้อบกพร่องใน JDK ดูคำตอบที่ได้รับการยอมรับในลิงค์ในคำตอบของคุณ
เตอร์

มันไม่ได้เป็นข้อผิดพลาดจริงๆ - การตั้งค่าทั้งเครื่องได้รับอนุญาตเฉพาะผู้ใช้ที่เป็นผู้ดูแลเครื่อง ใช้runasเพื่อเรียกใช้แอปพลิเคชันของคุณในฐานะผู้ใช้ที่เป็นผู้ดูแลระบบและมันจะสร้างรีจิสตรีคีย์อย่างมีความสุขภายใต้ HKLM สิ่งที่ Java ไม่มีคือกลไกในการขอใบอนุญาตยกระดับ (เช่นเป็นการดีที่จะเรียกใช้ Windows UAC แทนที่จะล้มเหลว - เป็นที่น่าสงสัยว่าเป็นความคิดที่ดีในระดับสากลหรือไม่)
ddimitrov

0

ปัญหาคือรหัสลงทะเบียนที่หายไป มันสามารถสร้างขึ้นได้ด้วยตนเอง

หรือ

มันสามารถสร้างขึ้นโดยอัตโนมัติโดยการเรียกใช้โปรแกรมในฐานะผู้ดูแลระบบหนึ่งครั้ง ที่จะให้สิทธิ์โปรแกรมที่จำเป็นและเมื่อมันจะวิ่งตามปกติมันจะยังคงทำงานได้อย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.