Cảnh báo Groovy Shell không thể mở / tạo nút gốc prefs


188

Tôi đã thử mở Groovy Shell ( groovysh) trên Windows 8 và nhận được kết quả đầu ra sau:

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.

Sau khi in thông báo trên, vỏ bắt đầu như mong đợi.



1
Tùy chọn được lưu trong một tệp như cửa hàng sao lưu nên tránh vấn đề hoàn toàn. Có những tình huống dựa vào người dùng cuối để thay đổi sổ đăng ký gớm ghiếc của họ không phải là một giải pháp khả thi.
Dave Jarvis

2
Đây là một lỗi Java đã biết vẫn còn tồn tại trên WIndows 10 và cập nhật 112. Chỉ cần chạy chương trình một lần từ dấu nhắc nâng cao và nó sẽ biến mất.
david.pfx

Câu trả lời:


328

Dennis trả lời đúng. Tuy nhiên, tôi muốn giải thích giải pháp theo cách chi tiết hơn một chút (đối với Người dùng Windows):

  1. Đi vào Menu Bắt đầu của bạn và nhập regeditvào trường tìm kiếm.
  2. Điều hướng đến đường dẫn HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 dường như có cái này ở đây HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft:)
  3. Nhấp chuột phải vào thư mục JavaSoft và nhấp vào New->Key
  4. Đặt tên cho Key mới Prefsvà mọi thứ sẽ hoạt động.

Hoặc, lưu và thực thi một *.regtệp có nội dung sau:

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

7
Có thể làm điều này progmatically?
facetoe

12
Tôi có thể xác nhận nó sẽ không hoạt động nếu được thực hiện theo HKEY_CURRENT_USER. Một câu hỏi hay hơn, tại sao trên trái đất lại là một sản phẩm dựa trên Java tự buộc vào Windows Registry?
avgvstvs

5
Ứng dụng khách hàng không thể yêu cầu người dùng đi và tìm hiểu về sổ đăng ký. Tại sao Java luôn thực hiện một nửa giải pháp như thế này.
El Mac

15
Cài đặt Windows 10 của tôi có cả hai đường dẫn chính được chỉ ra ở trên, việc sửa lỗi cài đặt của tôi yêu cầu thêm Prefs vào HKEY_LOCAL_MACHINE \ Software \ JavaSoft không phải là HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124

2
Trên Windows 10 vẫn là vị trí phù hợp cho thư mục Perfs làHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur

72

Tôi đã có thể giải quyết vấn đề bằng cách tạo thủ công khoá đăng ký sau:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

Bạn có phiền cho tôi biết quá trình chính xác? Tôi làm việc chủ yếu trên Mac nhưng tôi gặp lỗi này khi chạy chương trình của mình trên Windows và tôi muốn biết cách khắc phục.
Tơ lụa tơ tằm

14
Tôi đang thấy điều này trên phần mềm mà chúng tôi bán. Một bản sửa lỗi tự động / lập trình sẽ tốt hơn nếu bạn cũng có một trong số đó. Nói người dùng cuối của tôi nhảy vào regedit là một triển vọng đáng sợ. Có cách nào để Java thực hiện việc này một cách tự động trên Windows 8.1 (đây là nền tảng duy nhất tôi thấy lỗi trên).
Brian Knoblauch

Lỗi cũng xảy ra trong Windows 10 và bản sửa lỗi này đã hoạt động
TriumphST 11/05/2016

45

Đây thực sự là một lỗi JDK. Nó đã được báo cáo nhiều lần trong những năm qua, nhưng chỉ trong năm 8139507, nó cuối cùng đã được Oracle thực hiện nghiêm túc.

Vấn đề là ở mã nguồn JDK cho WindowsPreferences.java. Trong lớp này, cả hai nút userRootsystemRootđược khai báo tĩnh như trong:

/**
 * 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);

Điều này có nghĩa là lần đầu tiên lớp được tham chiếu cả hai biến tĩnh sẽ được bắt đầu và bằng cách này, Khóa đăng ký cho HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs(= cây hệ thống) sẽ được cố gắng tạo nếu nó không tồn tại.

Vì vậy, ngay cả khi người dùng thực hiện mọi biện pháp phòng ngừa trong mã riêng của mình và không bao giờ chạm vào hoặc tham chiếu cây hệ thống, thì JVM thực sự vẫn sẽ cố gắng khởi tạo systemRoot, do đó gây ra cảnh báo. Đó là một lỗi tinh tế thú vị.

Có một bản sửa lỗi được cam kết với nguồn JDK vào tháng 6 năm 2016 và nó là một phần của Java9 trở đi. Ngoài ra còn có một backport cho Java8 trong u202.

Những gì bạn thấy thực sự là một cảnh báo từ logger nội bộ của JDK. Nó không phải là một ngoại lệ. Tôi tin rằng cảnh báo có thể được bỏ qua một cách an toàn .... trừ khi mã người dùng thực sự muốn các tùy chọn hệ thống, nhưng điều đó rất hiếm khi xảy ra.

Thông tin thưởng

Lỗi không tự tiết lộ trong các phiên bản trước Java 1.7.21, bởi vì cho đến lúc đó trình cài đặt JRE sẽ tạo khóa Registry HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefscho bạn và điều này sẽ che giấu lỗi một cách hiệu quả. Mặt khác, bạn chưa bao giờ thực sự được yêu cầu chạy trình cài đặt để có JRE trên máy của mình, hoặc ít nhất đây không phải là ý định của Sun / Oracle. Như bạn có thể biết, Oracle đã phân phối JRE cho Windows ở .tar.gzđịnh dạng trong nhiều năm.


Cảm ơn cho một phân tích sâu sắc. Vấn đề 8139507 , mà bạn đã đề cập, cho biết lỗi đã được sửa trong JDK 9.
realsonic

3
@realsonic. Thêm vào đó: Dường như Oracle cuối cùng đã tìm cách khắc phục sự cố này. Nó được cố định trong 8u202 . (tính 30Sep2018 phiên bản mới nhất của Java 8 là u181 nên việc sửa chữa được backported nhưng chưa có trong bất kỳ phiên bản phát hành)
peterh

30

Nếu bất cứ ai đang cố gắng giải quyết vấn đề này trên phiên bản Windows 64 bit, bạn có thể cần tạo khóa sau:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
Tôi đã gặp lỗi này khi sử dụng JVM 64 bit trên Windows 7 64 bit và giải pháp mà Dennis và MKorsch đề xuất chỉ hoạt động tốt với tôi. Có lẽ giải pháp Wow6432Node dành cho JVM 32 bit trên Windows 64 bit.
Scott Johnson

7

Vấn đề là giao diện điều khiển đơn giản không thể chỉnh sửa sổ đăng ký. Không cần chỉnh sửa sổ đăng ký bằng tay, chỉ cần khởi chạy groovyshmột lần với quyền riêng tư hành chính. Tất cả các lần ra mắt sau đó hoạt động mà không có lỗi.


2
Cảm ơn, tôi sẽ đề nghị những người khác dùng thử, đây là giải pháp đơn giản nhất :)
Aditya T

1
Câu trả lời dễ nhất, nên được đặt lên hàng đầu. Tôi đã có cảnh báo này khi thực hiện các bài kiểm tra JMeter, nhưng tôi đã bắt đầu khi jmeter.bat với tư cách Quản trị viên và cảnh báo không còn nữa.
KB

2

Có một vấn đề tương tự khi bắt đầu jache apache trên windows 8 64 bit:

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

Sử dụng thành công giải pháp Dennis Traub, với lời giải thích của Mkorsch. Hoặc bạn có thể tạo một tệp có phần mở rộng "reg" và ghi vào đó như sau:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... Sau đó thực hiện nó.


1

Tôi đã nhận được thông báo sau:

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

và nó đã biến mất sau khi tạo một trong các khóa registry này, của tôi là 64 bit nên tôi chỉ thử nó.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

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

1

Điều này đã xảy ra với tôi.

Rõ ràng đó là vì Java không có quyền tạo các khóa registry.

Xem: Java: java.util.Preferences Không thành công


Chà, chính xác hơn là do có lỗi trong JDK. Xem câu trả lời được chấp nhận trên các liên kết trong câu trả lời của bạn.
peterh

Đây không thực sự là một lỗi - cài đặt toàn máy chỉ được phép cho người dùng quản trị máy. Sử dụng runasđể chạy ứng dụng của bạn với tư cách là người dùng quản trị viên cục bộ và nó sẽ vui vẻ tạo khóa đăng ký theo HKLM. Những gì Java không có là một cơ chế để yêu cầu các permisisons nâng cao (nghĩa là lý tưởng là nó sẽ gọi Windows UAC thay vì thất bại - điều đáng nghi là liệu đó có phải là ý tưởng tốt hay không).
ddimitrov

0

Vấn đề thực sự là khóa đăng ký bị thiếu. Nó có thể được tạo bằng tay

HOẶC LÀ

nó có thể được tạo tự động bằng cách chạy chương trình với tư cách quản trị viên một lần. Điều đó sẽ cung cấp cho chương trình các quyền cần thiết và khi nó được chạy như bình thường, nó vẫn hoạt động chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.