Aviso do Groovy Shell "Não foi possível abrir / criar o nó raiz de prefs…"

188

Tentei abrir o Groovy Shell ( groovysh) no Windows 8 e obtive a seguinte saída:

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.

Depois de imprimir a mensagem acima, o shell iniciou como esperado.

Dennis Traub
fonte
3
Isso ocorre devido a um erro: bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382
Kristof Neirynck
1
As preferências salvas em um arquivo como repositório de backup devem evitar completamente o problema. Há situações em que confiar nos usuários finais para alterar seu registro abominável não é uma solução viável.
Dave Jarvis
2
É um bug Java conhecido ainda presente no Windows 10 e na atualização 112. Basta executar o programa uma vez a partir de um prompt elevado e ele desaparecerá.
David.pfx

Respostas:

328

A resposta de Dennis está correta. No entanto, gostaria de explicar a solução de uma maneira um pouco mais detalhada (para usuário do Windows):

  1. Acesse o menu Iniciar e digite regedito campo de pesquisa.
  2. Navegue para o caminho HKEY_LOCAL_MACHINE\Software\JavaSoft(agora o Windows 10 parece ter isso aqui HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft:)
  3. Clique com o botão direito do mouse na pasta JavaSoft e clique em New->Key
  4. Nomeie a nova chave Prefse tudo deve funcionar.

Como alternativa, salve e execute um *.regarquivo com o seguinte conteúdo:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
MKorsch
fonte
7
É possível fazer isso de forma programática?
facetoe
12
Posso confirmar que não funcionará se feito com HKEY_CURRENT_USER. Uma pergunta melhor, por que diabos um produto baseado em Java se vincula ao registro do Windows?
AVGVSTVS
5
Não é possível que um aplicativo de consumidor exija que o usuário mexa no registro. Por que o Java sempre implementa meias soluções como esta.
El Mac
15
Meu Windows 10 instalar tem dois caminhos principais indicado acima, fixando minha instalação necessário adicionar os Prefs para o HKEY_LOCAL_MACHINE \ Software \ JavaSoft não o HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124
2
No Windows 10, ainda o local certo para a pasta Perfs éHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur
72

Consegui resolver o problema criando manualmente a seguinte chave do Registro:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Dennis Traub
fonte
Você se importaria de me dizer o processo exato? Eu trabalho principalmente no Mac, mas estou recebendo esse erro quando executo meu programa no Windows e gostaria de saber como corrigi-lo.
Meshulam Silk
14
Estou vendo isso no software que vendemos. Uma correção automática / programática seria melhor se você também tiver uma. Dizer aos meus usuários finais que entram no regedit é uma perspectiva assustadora. Existe uma maneira de obter o Java para fazer isso automaticamente no Windows 8.1 (que é a única plataforma na qual vejo o erro).
precisa
Erro acontece no Windows 10, bem como, e essa correção trabalhou
TriumphST
45

Este é realmente um bug do JDK. Foi relatado várias vezes ao longo dos anos, mas somente em 8139507 foi finalmente levado a sério pela Oracle.

O problema estava no código fonte do JDK para WindowsPreferences.java. Nesta classe, ambos os nós userRoote systemRootforam declarados estáticos como em:

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

Isso significa que, na primeira vez em que a classe for referenciada, ambas as variáveis ​​estáticas seriam iniciadas e, com isso, a Chave do Registro para HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs(= árvore do sistema) tentará ser criada se ela ainda não existir.

Portanto, mesmo que o usuário tome todas as precauções em seu próprio código e nunca toque nem faça referência à árvore do sistema, a JVM ainda tentará instanciar systemRoot, causando o aviso. É um bug sutil interessante.

Há uma correção confirmada na fonte JDK em junho de 2016 e faz parte do Java9 em diante. Há também um backport para Java8 que está no u202.

O que você vê é realmente um aviso do registrador interno do JDK. Não é uma exceção. Acredito que o aviso possa ser ignorado com segurança .... a menos que o código do usuário esteja realmente querendo as preferências do sistema, mas esse raramente é o caso.

Informações sobre bônus

O bug não se revelou nas versões anteriores ao Java 1.7.21, porque até então o instalador do JRE criaria a chave do Registro HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefspara você e isso ocultaria efetivamente o bug. Por outro lado, você nunca foi realmente solicitado a executar um instalador para ter um JRE em sua máquina, ou pelo menos essa não foi a intenção da Sun / Oracle. Como você deve saber, a Oracle distribui o JRE para Windows em .tar.gzformato há muitos anos.

peterh
fonte
Obrigado por uma análise tão profunda. Edição 8139507 , que você mencionou, diz o bug foi corrigido no JDK 9.
realsonic
3
@realsonic. Além disso: parece que a Oracle finalmente conseguiu suportar essa correção. É fixado em 8u202 . (a partir de 30Sep2018 a última versão do Java 8 é u181 de modo que a correção é backported, mas ainda não em qualquer versão lançada)
peterh
30

Se alguém estiver tentando resolver isso em uma versão de 64 bits do Windows, talvez seja necessário criar a seguinte chave:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
walkern
fonte
9
Eu recebi esse erro ao usar uma JVM de 64 bits no Windows 7 de 64 bits, e a solução proposta por Dennis e MKorsch funcionou muito bem para mim. Talvez a solução Wow6432Node seja para JVMs de 32 bits no Windows de 64 bits.
21814 Scott Scott Johnson
7

O problema é que o console simples não pode editar o registro. Não há necessidade de editar o registro manualmente, basta iniciar o groovyshuma vez com privilégios administrativos. Todos os lançamentos subsequentes funcionam sem erros.

Darksnake
fonte
2
Graças, gostaria de sugerir outros para tentar isso, sua a solução mais simples :)
Aditya T
1
A resposta mais fácil, deve estar no topo. Eu tinha esse aviso executando os testes do JMeter, mas iniciei assim que o jmeter.bat como Administrador e o aviso desapareceu.
KB
2

Teve um problema semelhante ao iniciar o apache jmeter no Windows 8 de 64 bits:

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

Solução Dennis Traub usada com sucesso, com explicações de Mkorsch. Ou você pode criar um arquivo com a extensão "reg" e escrever o seguinte:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

... então execute.

razvanone
fonte
1

Eu estava recebendo a seguinte mensagem:

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

e se foi depois de criar uma dessas chaves de registro, a minha é de 64 bits, então tentei apenas isso.

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

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

Isso aconteceu comigo.

Aparentemente, é porque o Java não tem permissão para criar chaves do registro.

Consulte: Java: java.util.Preferences falhando

Wolsie
fonte
Bem, mais precisamente, é porque há um erro no JDK. Veja a resposta aceita no link da sua resposta.
Peterh
Na verdade, não é um bug - as configurações em toda a máquina são permitidas apenas para usuários administrativos da máquina. Use runaspara executar seu aplicativo como usuário administrador local e ele criará com prazer a chave do registro em HKLM. O que o Java não possui é um mecanismo para solicitar permissões elevadas (ou seja, idealmente, ele invocaria o Windows UAC em vez de falhar - é questionável se isso é universalmente uma boa idéia).
Ddimitrov 08/11/19
0

O problema é realmente a chave de registro que está faltando. Pode ser criado manualmente

OU

Ele pode ser criado automaticamente , executando o programa como administrador uma vez. Isso dará ao programa as permissões necessárias e, quando será executado normalmente, continuará funcionando corretamente.

Alessandro Roaro
fonte