Peringatan Groovy Shell “Tidak dapat membuka / membuat prefs root node…”

188

Saya mencoba membuka Shell Groovy ( groovysh) pada Windows 8 dan mendapatkan output berikut:

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.

Setelah mencetak pesan di atas, shell mulai seperti yang diharapkan.

Dennis Traub
sumber
3
Ini karena bug: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck
1
Preferensi yang disimpan dalam file sebagai backing store harus menghindari masalah ini sepenuhnya. Ada situasi di mana mengandalkan pengguna akhir untuk mengubah registri keji mereka bukanlah solusi yang layak.
Dave Jarvis
2
Ini adalah bug Java yang dikenal masih ada di WIndows 10 dan memperbarui 112. Jalankan saja program sekali dari prompt yang ditinggikan dan hilang.
david.pfx

Jawaban:

328

Jawaban Dennis benar. Namun saya ingin menjelaskan solusinya dengan cara yang sedikit lebih rinci (untuk Pengguna Windows):

  1. Buka Start Menu Anda dan ketikkan di regeditkolom pencarian.
  2. Menavigasi ke jalur HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 tampaknya sekarang memiliki ini di sini HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft:)
  3. Klik kanan pada folder JavaSoft dan klik pada New->Key
  4. Beri nama Kunci baru Prefsdan semuanya harus berfungsi.

Atau, simpan dan jalankan *.regfile dengan konten berikut:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
MKorsch
sumber
7
Apakah mungkin melakukan ini secara progmatis?
facetoe
12
Saya dapat mengonfirmasi bahwa itu tidak akan berfungsi jika dilakukan di bawah HKEY_CURRENT_USER. Pertanyaan yang lebih baik, mengapa ada produk berbasis Java yang mengikatkan diri ke Windows Registry?
avgvstvs
5
Tidak mungkin bagi aplikasi konsumen untuk meminta pengguna untuk pergi dan mengutak-atik registri. Mengapa Java selalu menerapkan setengah solusi seperti ini.
El Mac
15
Instalasi Windows 10 saya memiliki kedua jalur utama yang ditunjukkan di atas, memperbaiki instalasi saya diperlukan menambahkan Prefs ke HKEY_LOCAL_MACHINE \ Software \ JavaSoft bukan HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124
2
Pada Windows 10 masih lokasi yang tepat untuk folder Perfs adalahHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur
72

Saya dapat menyelesaikan masalah dengan secara manual membuat kunci registri berikut:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Dennis Traub
sumber
Maukah Anda menceritakan proses yang tepat kepada saya? Saya bekerja terutama di Mac tetapi saya mendapatkan kesalahan ini ketika saya menjalankan program saya di Windows dan saya ingin tahu bagaimana cara memperbaikinya.
Sutra Meshulam
14
Saya melihat ini pada perangkat lunak yang kami jual. Perbaikan otomatis / terprogram akan lebih baik jika Anda juga memiliki salah satunya. Memberitahu pengguna akhir saya untuk beralih ke regedit adalah prospek yang menakutkan. Apakah ada cara untuk membuat Java melakukan ini secara otomatis pada Windows 8.1 (yang merupakan satu-satunya platform yang saya lihat kesalahannya).
Brian Knoblauch
Kesalahan juga terjadi pada Windows 10, dan perbaikan ini berhasil
TriumphST
45

Ini sebenarnya adalah bug JDK. Telah dilaporkan beberapa kali selama bertahun-tahun, tetapi hanya pada 8139507 yang akhirnya dianggap serius oleh Oracle.

Masalahnya adalah dalam kode sumber JDK untuk WindowsPreferences.java. Di kelas ini, kedua node userRootdan systemRootdinyatakan statis seperti pada:

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

Ini berarti bahwa pertama kali kelas direferensikan, kedua variabel statis akan diinisiasi dan dengan ini Kunci Registri untuk HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs(= susunan sistem) akan dicoba dibuat jika belum ada.

Jadi, bahkan jika pengguna mengambil setiap tindakan pencegahan dalam kodenya sendiri dan tidak pernah menyentuh atau merujuk pohon sistem, maka JVM sebenarnya akan tetap mencoba untuk instantiate systemRoot, sehingga menyebabkan peringatan. Ini adalah bug halus yang menarik.

Ada perbaikan yang dilakukan pada sumber JDK pada Juni 2016 dan itu adalah bagian dari Java9 dan seterusnya. Ada juga backport untuk Java8 yang ada di u202.

Apa yang Anda lihat sebenarnya adalah peringatan dari pencatat internal JDK. Ini bukan pengecualian. Saya percaya bahwa peringatan itu dapat diabaikan dengan aman .... kecuali kode pengguna memang menginginkan preferensi sistem, tetapi itu sangat jarang terjadi.

Info bonus

Bug tidak mengungkapkan dirinya dalam versi sebelum Java 1.7.21, karena sampai saat itu installer JRE akan membuat kunci Registry HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsuntuk Anda dan ini akan secara efektif menyembunyikan bug. Di sisi lain Anda tidak pernah benar-benar diminta untuk menjalankan installer untuk memiliki JRE pada mesin Anda, atau setidaknya ini bukan niat Sun / Oracle. Seperti yang Anda ketahui, Oracle telah mendistribusikan JRE untuk Windows dalam .tar.gzformat selama bertahun-tahun.

peterh
sumber
Terima kasih untuk analisis yang mendalam. Edisi 8139507 , yang Anda sebutkan, mengatakan bug diperbaiki di JDK 9.
realsonic
3
@realals. Tambahkan ke itu: Tampaknya Oracle akhirnya mendukung backporting perbaikan ini. Hal ini tetap di 8u202 . (per 30Sep2018, rilis Java 8 terbaru adalah u181 sehingga perbaikannya di-backport tetapi belum dalam versi rilis mana pun)
peterh
30

Jika ada yang mencoba menyelesaikan ini pada versi 64-bit Windows, Anda mungkin perlu membuat kunci berikut:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
walkern
sumber
9
Saya mendapatkan kesalahan ini saat menggunakan JVM 64-bit pada 64-bit Windows 7, dan solusi yang disarankan Dennis dan MKorsch bekerja dengan baik untuk saya. Mungkin solusi Wow6432Node adalah untuk JVM 32-bit pada Windows 64-bit.
Scott Johnson
7

Masalahnya adalah konsol sederhana tidak dapat mengedit registri. Tidak perlu mengedit registri dengan tangan, cukup luncurkan groovyshsekali dengan hak administratif. Semua peluncuran berikutnya bekerja tanpa kesalahan.

Darksnake
sumber
2
Terima kasih, saya akan menyarankan orang lain untuk mencoba ini, ini adalah solusi paling sederhana :)
Aditya T
1
Jawaban termudah, harus di atas. Saya memiliki peringatan ini menjalankan tes JMeter, tapi saya mulai setelah jmeter.bat sebagai Administrator dan peringatan itu hilang.
KB
2

Punya masalah serupa ketika memulai apache jmeter di 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.

Solusi Dennis Traub berhasil digunakan, dengan penjelasan Mkorsch. Atau Anda dapat membuat file dengan ekstensi "reg" dan menulis ke dalamnya sebagai berikut:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... lalu jalankan.

Razvanone
sumber
1

Saya mendapatkan pesan berikut:

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

dan itu hilang setelah membuat salah satu kunci registri ini, milik saya 64 bit jadi saya mencoba hanya itu.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Sohail Ahmed
sumber
1

Ini terjadi pada saya.

Ternyata itu karena Java tidak memiliki izin untuk membuat kunci registri.

Lihat: Java: java.util.Preferensi Gagal

Wolsie
sumber
Yah, lebih tepatnya itu karena ada bug di JDK. Lihat jawaban yang diterima pada tautan dalam jawaban Anda.
peterh
Ini bukan bug - pengaturan seluruh mesin hanya diizinkan untuk pengguna admin mesin. Gunakan runasuntuk menjalankan aplikasi Anda sebagai pengguna admin lokal dan dengan senang hati akan membuat kunci registri di bawah HKLM. Apa yang tidak dimiliki Java adalah mekanisme untuk meminta permisison tinggi (yaitu idealnya akan menggunakan Windows UAC dan bukannya gagal - patut dipertanyakan apakah itu ide bagus secara universal).
ddimitrov
0

Masalahnya memang kunci register yang hilang. Itu dapat dibuat secara manual

ATAU

itu dapat dibuat secara otomatis dengan menjalankan program sebagai administrator sekali. Itu akan memberi program izin yang diperlukan, dan ketika itu akan dijalankan seperti biasa itu akan tetap bekerja dengan benar.

Alessandro Roaro
sumber