Groovy Shell uyarısı “Tercihler kök düğümü açılamadı / oluşturulamadı…”


188

groovyshWindows 8'de Groovy Shell'i ( ) açmaya çalıştım ve aşağıdaki çıktıyı aldım:

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.

Yukarıdaki mesajı yazdırdıktan sonra kabuk beklendiği gibi başladı.



1
Destek deposu olarak bir dosyaya kaydedilen tercihler sorunu tamamen önlemelidir. Son kullanıcıların, iğrenç kayıt defterini değiştirmelerine güvenmenin uygun bir çözüm olmadığı durumlar vardır .
Dave Jarvis

2
Windows 10'da hala bilinen bir Java hatası ve 112'yi güncelleyin. Programı yükseltilmiş bir istemden bir kez çalıştırın ve gider.
david.pfx

Yanıtlar:


328

Dennis cevap doğrudur. Ancak (Windows Kullanıcısı için) çözümü biraz daha ayrıntılı bir şekilde açıklamak istiyorum:

  1. Başlat Menünüze gidin ve regeditarama alanına yazın.
  2. Yoluna gidin HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10 şimdi burada bu var gibi gözüküyor: HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft)
  3. JavaSoft klasörünü sağ tıklayın ve New->Key
  4. Yeni Anahtarı adlandırın Prefsve her şeyin çalışması gerekir.

Alternatif olarak, *.regaşağıdaki içeriğe sahip bir dosyayı kaydedip yürütün :

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

7
Bunu progmatik olarak yapmak mümkün mü?
facetoe

12
HKEY_CURRENT_USER altında yapılırsa işe yaramayacağını onaylayabilirim. Daha iyi bir soru, neden dünyadaki Java tabanlı bir ürün kendisini Windows Kayıt Defteri'ne bağlıyor?
avgvstvs

5
Bir tüketici uygulamasının kullanıcının kayıt defterine gitmesini ve keman çalmasını gerektirmesi mümkün değildir. Java neden her zaman bunun gibi yarı çözümler uygular.
El Mac

15
Benim Windows 10 sahiptir hem anahtar yolları değil HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft benim kurulum HKEY_LOCAL_MACHINE \ Software \ JavaSoft için Prefs ekleyerek gerekli sabitleme, yukarıda belirtilen yüklemek
gt124

2
Windows 10'da Perfs klasörü için hala doğru konumHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur

72

Aşağıdaki kayıt defteri anahtarını el ile oluşturarak sorunu çözebildim:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

Bana tam süreci anlatmak ister misiniz? Çoğunlukla Mac üzerinde çalışıyorum, ancak programımı Windows'ta çalıştırdığımda bu hatayı alıyorum ve nasıl düzeltileceğini bilmek istiyorum.
Meshulam Silk

14
Bunu sattığımız yazılımlarda görüyorum. Bunlardan birine sahipseniz otomatik / programlı bir düzeltme daha iyi olurdu. Son kullanıcılara regedit'e geçmelerini söylemek korkunç bir ihtimal. Java'yı Windows 8.1'de otomatik olarak yapmanın bir yolu var mı (hatayı gördüğüm tek platform).
Brian Knoblauch

Windows 10'da da hata
oluşuyor

45

Bu aslında bir JDK hatası. Yıllar boyunca birkaç kez rapor edildi, ancak yalnızca 8139507'de Oracle tarafından ciddiye alındı.

Sorun için JDK kaynak kodunda idi WindowsPreferences.java. Bu sınıfta, her iki düğüm userRootve systemRootstatik olarak şu şekilde bildirildi:

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

Bu, sınıfa ilk kez başvurulduğunda her iki statik değişkenin başlatılacağı ve bu durumda HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs(= sistem ağacı) için Kayıt Defteri Anahtarı henüz oluşturulmamışsa oluşturulmaya çalışılacağı anlamına gelir.

Bu nedenle, kullanıcı kendi kodunda her türlü önlemi alıp sistem ağacına hiç dokunmadıysa veya referansta bulunmasa bile, JVM aslında başlatmaya çalışarak systemRootuyarıya neden olur. İlginç bir ince böcek.

Haziran 2016'da JDK kaynağına adanmış bir düzeltme var ve bu, Java9'dan itibaren bir parçası. Ayrıca u202'de bulunan Java8 için bir backport var .

Gördüğünüz şey gerçekten JDK'nın dahili kaydedicisinden bir uyarı. Bu bir istisna değildir. Kullanıcı kodu gerçekten sistem tercihlerini istemedikçe uyarı güvenli bir şekilde göz ardı edilebilir inanıyorum, ama bu çok nadiren durum.

Bonus bilgisi

Hata, Java 1.7.21'den önceki sürümlerde kendini göstermedi, çünkü o zamana kadar JRE yükleyicisi HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefssizin için Kayıt Defteri anahtarı oluşturacak ve bu da hatayı etkili bir şekilde gizleyecektir. Öte yandan, makinenizde bir JRE olması için hiçbir zaman bir yükleyici çalıştırmanız gerekmedi veya en azından bu Sun / Oracle'ın amacı değildi. Bildiğiniz gibi Oracle, Windows için JRE'yi .tar.gzyıllardır formatta dağıtıyor .


Böyle derin bir analiz için teşekkürler. Bahsettiğiniz sayı 8139507 , hatanın JDK 9'da düzeltildiğini söylüyor
realsonic

3
@realsonic. Buna ek olarak: Görünüşe göre Oracle nihayet bu düzeltmeyi desteklemeye başladı. O edilir 8u202 giderilmiştir . (30Sep2018'den itibaren Java 8'in son sürümü u181'dir, bu nedenle düzeltme desteklenir, ancak henüz yayınlanmış bir sürümde değildir)
peterh

30

Herhangi biri bunu Windows'un 64 bit sürümünde çözmeye çalışıyorsa, aşağıdaki anahtarı oluşturmanız gerekebilir:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
64-bit Windows 7'de 64-bit JVM kullanırken bu hatayı aldım ve Dennis ve MKorsch'un önerdiği çözüm benim için iyi çalıştı. Belki de Wow6432Node çözümü 64 bit Windows'ta 32 bit JVM'ler içindir.
Scott Johnson

7

Sorun, basit konsolun kayıt defterini düzenleyememesidir. Kayıt defterini el ile düzenlemeye gerek yok, sadece bir groovyshkez yönetici ayrıcalıklarıyla başlatın . Sonraki tüm lansmanlar hatasız çalışır.


2
Teşekkürler, ben bunu denemek için başkalarına tavsiye ederim, onun en basit çözüm :)
Aditya T

1
JMeter testlerini uygularken bu uyarıyı aldım, ancak jmeter.bat dosyasına Yönetici olarak başladım ve uyarı gitti.
KB

2

Windows 8 64 bit apache jmeter başlatılırken benzer bir sorun vardı:

[]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 açıklamalarıyla Dennis Traub çözümünü başarıyla kullandı. Veya "reg" uzantılı bir dosya oluşturabilir ve bu dosyaya aşağıdakileri yazabilirsiniz:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... sonra yürütün.


1

Aşağıdaki mesajı alıyordum:

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

ve bu kayıt defteri anahtarlarından birini oluşturduktan sonra gitti, benimki 64 bit yani sadece denedim.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

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

1

Bu bana oldu.

Görünüşe göre Java kayıt defteri anahtarları oluşturma iznine sahip değil.

Bkz. Java: java.util.Preferences Başarısız


Daha doğrusu, JDK'da bir hata olduğu için. Cevabınızdaki bağlantıda kabul edilen yanıtı görün.
peterh

Bu gerçekten bir hata değildir - makine genelindeki ayarlara yalnızca makine yöneticisi kullanıcılar tarafından izin verilir. runasUygulamanızı yerel yönetici kullanıcı olarak çalıştırmak için kullanın ve HKLM altında kayıt defteri anahtarını mutlu bir şekilde oluşturur. Java'nın sahip olmadığı, yükseltilmiş izinler istemek için bir mekanizmadır (yani ideal olarak başarısız olmak yerine Windows UAC'yi çalıştırırdı - bunun evrensel olarak iyi bir fikir olup olmadığı tartışmalıdır).
ddimitrov

0

Sorun aslında eksik olan kayıt anahtarıdır. Manuel olarak oluşturulabilir

VEYA

o oluşturulabilir automagicallylar kez yönetici olarak program çalıştırarak. Bu, programa gerekli izinleri verecektir ve normal olarak çalıştırılacağı zaman hala düzgün çalışacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.