public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
é uma classe minha. A classe reside no mesmo arquivo JAR da classe principal. Portanto, isso não deve ocorrer porque algum JAR está ausente no caminho de classe.
Quando olho para o arquivo JAR jar tf myjarfile
, posso ver os PropHolder.class
listados lá.
Btw: o código está funcionando bem na minha máquina local. Mas não funcionou quando o implantei com algum script em um servidor Linux. Então eu acho que não é o problema do código. Mas por algum motivo. o processo de implantação é muito difícil de rastrear.
Qual poderia ser o problema?
Respostas:
Minha melhor aposta é que há um problema aqui:
Parece que alguma exceção não capturada ocorreu e se propagou até o ClassLoader real que tentava carregar a classe. No entanto, precisaríamos de um rastreamento de pilha para confirmar isso.
Isso ocorreu ou ocorreu ao criar
PropHolder.prop
variável estática.fonte
static
problema. O que precisa ser feito para resolver o problema?static
bloco. Para depurá-lo, coloque umtry/catch(Exception e)
bloco inteiro e registre a exceção. Você terá que corrigir essa exceção. Normalmente, a exceção será registrada, mas pode ser difícil de encontrar, uma vez que o ser registrada durante classloading que pode acontecer muito cedotry catch
bloco e ele disseFailed to initialize ClassA
. Eu acho que é o problema deJVM
. Eu reiniciei meu sistema e tudo funcionou bem. Como resolver esse problema no futuro sem reiniciar o sistema e resolvê-lo com uma solução simples.cause
se disponível. UmNoClassDefFoundError
está sempre associado a outro erro, você vai precisar de olhar para ele nos logs ou tentar registrá-lo mais apropriadamente (como força o registro em um novo arquivo no sistema de arquivos)Você está recebendo um
java.lang.NoClassDefFoundError
que NÃO significa que sua classe está faltando (nesse caso, você obteria umjava.lang.ClassNotFoundException
). O ClassLoader encontrou um erro ao ler a definição de classe ao tentar ler a classe.Coloque um try / catch dentro do seu inicializador estático e observe a exceção. Se você ler alguns arquivos lá e diferir do ambiente local, é muito provável que seja a causa do problema (talvez o arquivo não possa ser encontrado, sem permissões etc.).
fonte
@Stateless
, então, apenas adicionei a dependência correspondente e fui capaz de prosseguir. Obrigado pela dica!NoClassDefFoundError não dá muita pista do que deu errado dentro do bloco estático. É uma boa prática sempre ter um bloco como esse dentro do código de inicialização estático {...}:
fonte
Eu tive a mesma exceção, foi assim que resolvi o problema:
Condições prévias:
Classe Junit (e teste), que estendeu outra classe.
ApplicationContext inicializado usando spring, que inicia o projeto.
O contexto do aplicativo foi inicializado no método @Before
Solução:
Inicie o contexto do aplicativo a partir do método @BeforeClass, pois a classe pai também exigiu algumas classes que foram inicializadas no contexto do aplicativo.
Espero que isso ajude.
fonte
Como mencionado acima, isso pode ser uma série de coisas. No meu caso, eu tinha uma variável inicializada estaticamente que contava com uma entrada ausente no meu arquivo de propriedades. Adicionada a entrada ausente ao arquivo de propriedades e o problema foi resolvido.
fonte
Apenas alguns dias atrás, eu encontrei a mesma pergunta como a sua. Todo o código funciona bem na minha máquina local, mas resulta em erro (noclassdeffound & initialize). Então, posto minha solução, mas não sei por que, apenas proponho uma possibilidade. Espero que alguém saiba explique isso. @ John Vint Em primeiro lugar, mostrarei meu problema. Meu código tem variável estática e bloco estático. Quando conheci esse problema, tentei a solução de John Vint e tentei capturar a exceção. No entanto, eu não peguei nada. Então eu pensei que é porque a variável estática (mas agora eu sei que eles são a mesma coisa) e ainda não encontrei nada. Então, eu tento encontrar a diferença entre a máquina linux e o meu computador. Então eu descobri que esse problema ocorre apenas quando vários threads são executados em um processo (a propósito, a máquina linux tem núcleos duplos e processos duplos). Isso significa que, se duas tarefas (ambas usam o código que possui bloco ou variáveis estáticas) executadas no mesmo processo, dá errado, mas se executadas em processos diferentes, as duas estão ok. Na máquina Linux, eu uso
para executar uma tarefa e como minha variável estática é iniciar um contêiner (ou talvez você inicialize um novo carregador de classes), ele permanecerá até que a jvm pare e a jvm pare apenas quando todas as tarefas em um processo pararem. Toda tarefa iniciará um novo contêiner (ou carregador de classe) e isso deixará a jvm confusa. Como resultado, o erro acontece. Então, como resolver isso? Minha solução é adicionar um novo comando ao comando maven e fazer com que cada tarefa vá para o mesmo contêiner.
Talvez você já tenha resolvido esse problema, mas ainda espero que ajude outras pessoas que enfrentam o mesmo problema.
fonte
java.lang.ExceptionInInitializerError: null
:, significa que não é possível encontrar a classe no carregador de classes ou não sabe carregar qual (eu acho). Você conheceu isso?Eu tive a mesma exceção - mas apenas durante a execução no modo de depuração, foi assim que resolvi o problema (após 3 dias inteiros): no build.gradle eu tinha: "multiDexEnabled true" definido na seção defaultConfig.
mas aparentemente isso não foi suficiente. mas quando mudei:
para:
isso resolveu. espero que isso ajude alguém
fonte
Se você estiver trabalhando em um projeto Android, verifique se não está chamando nenhum método estático em nenhuma classe do Android. Estou usando apenas o JUnit + Mockito, então talvez outras estruturas possam ajudá-lo a evitar o problema completamente, não tenho certeza.
Meu problema foi chamar
Uri.parse(uriString)
como parte de um inicializador estático para um teste de unidade. A classe Uri é uma API do Android, e é por isso que o teste de unidade não conseguiu encontrá-lo. Alterei esse valor para emnull
vez disso e tudo voltou ao normal.fonte
Eu tive os mesmos problemas: java.lang.NoClassDefFoundError: Não foi possível inicializar a classe com.xxx.HttpUtils
é o problema do ambiente. Isso significa que as propriedades em application.yml estão incorretas ou vazias!
fonte
Eu encontro o mesmo problema. Eu iniciei um objeto de bean no bloco estático como abaixo:
Só porque o processo em que o meu bean obedeceu causou um NPE, eu tenho problemas. Então, acho que você deve verificar seu bloco de código estático com cuidado.
fonte