Estou investigando o seguinte java.lang.VerifyError
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴Mt̴MÚw€mçw€mp:”MŒŒ
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
at java.lang.Class.getConstructor0(Class.java:2671)
Ocorre quando o servidor jboss no qual o servlet está implementado é iniciado. É compilado com o jdk-1.5.0_11 e tentei recompilar com o jdk-1.5.0_15 sem êxito. Essa é a compilação que funciona bem, mas quando implantada, o java.lang.VerifyError ocorre.
Quando mudei o nome do método e recebi o seguinte erro:
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources ØÅN|ØÅNÚw€mçw€mX#ÖM|XÔM
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
at java.lang.Class.getConstructor0(Class.java:2671)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
Você pode ver que mais da assinatura do método é mostrada.
A assinatura real do método é
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
Eu já tentei olhar para ele javap
e isso dá a assinatura do método como deveria ser.
Quando meus outros colegas conferem o código, compilam e implantam, eles têm o mesmo problema. Quando o servidor de compilação pega o código e o implementa nos ambientes de desenvolvimento ou teste (HPUX), o mesmo erro ocorre. Além disso, uma máquina de teste automatizada executando o Ubuntu mostra o mesmo erro durante a inicialização do servidor.
O restante do aplicativo é executado corretamente, apenas esse servlet está com defeito. Qualquer idéia para onde procurar seria útil.
fonte
Respostas:
java.lang.VerifyError
pode ser o resultado quando você compilou em uma biblioteca diferente da que está usando no tempo de execução.Por exemplo, isso aconteceu comigo ao tentar executar um programa que foi compilado no Xerces 1, mas o Xerces 2 foi encontrado no caminho de classe. As classes necessárias (no
org.apache.*
espaço para nome) foram encontradas no tempo de execução, portanto nãoClassNotFoundException
foi o resultado. Houve alterações nas classes e métodos, de modo que as assinaturas de método encontradas no tempo de execução não correspondiam ao que havia no tempo de compilação.Normalmente, o compilador sinalizará problemas onde as assinaturas de método não coincidem. A JVM verificará o bytecode novamente quando a classe for carregada e será lançada
VerifyError
quando o bytecode estiver tentando fazer algo que não deveria ser permitido - por exemplo, chamar um método que retorneString
e depois armazene esse valor de retorno em um campo que contenha aList
.fonte
-verbose:class
e, em seguida, procure a classe imediatamente antes do carregamentojava.lang.VerifyError
. Isso terá o caminho para o JAR. Usejavap
e compare isso com a classe na qual você está compilando. Achei isso útil, pois a classe relatada no erro não era a causa, na verdade, era um dos argumentos.java.lang.VerifyError
são os piores.Você obteria esse erro se o tamanho do bytecode do seu método exceder o limite de 64kb; mas você provavelmente teria notado isso.
Você tem 100% de certeza de que essa classe não está presente no caminho de classe em outro lugar do seu aplicativo, talvez em outro jar?
Além disso, no seu rastreamento de pilha, a codificação de caracteres do arquivo de origem (
utf-8
?) Está correta?fonte
Como Kevin Panko disse, é principalmente por causa da mudança de biblioteca. Portanto, em alguns casos, uma "limpeza" do projeto (diretório) seguida por uma compilação faz o truque.
fonte
Uma coisa que você pode tentar é usar o
-Xverify:all
que verificará o bytecode durante o carregamento e, às vezes, fornecerá mensagens de erro úteis se o bytecode for inválido.fonte
Corrigi esse erro no Android criando o projeto que estava importando uma biblioteca, conforme descrito aqui http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
Anteriormente, eu estava apenas referenciando o projeto (não tornando-o uma biblioteca) e estava recebendo esse VerifyError estranho.
Espero que ajude alguém.
fonte
VerifyError significa que o arquivo de classe contém um bytecode que está sintaticamente correto, mas viola algumas restrições semânticas, por exemplo, um destino de salto que atravessa os limites do método.
Basicamente, um VerifyError só pode ocorrer quando há um erro do compilador ou quando o arquivo de classe é corrompido de alguma outra maneira (por exemplo, devido a RAM defeituosa ou HD com falha).
Tente compilar com uma versão diferente do JDK e em uma máquina diferente.
fonte
No meu caso, meu projeto Android depende de outro projeto Java compilado para Java 7.
java.lang.VerifyError
desapareceu depois que alterei o Nível de conformidade do compilador desse projeto Java para 6.0Mais tarde, descobri que esse é um problema da Dalvik: https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE
fonte
Eu estava recebendo esse problema devido ao pack200 manipular um arquivo de classe. Um pouco de pesquisa aumentou esse bug do java . Basicamente, a configuração
--effort=4
fez com que o problema desaparecesse.Usando o java 1.5.0_17 (embora tenha surgido em todas as variantes do java 1.5 que eu experimentei).
fonte
Corrigi um problema semelhante ao java.lang.VerifyError, substituindo
com
onde
MagickException
foi definido em um projeto de biblioteca (no qual meu projeto tem uma dependência).Depois disso, recebi uma
java.lang.NoClassDefFoundError
aula sobre a mesma biblioteca (corrigida de acordo com https://stackoverflow.com/a/9898820/755804 ).fonte
Isso pode acontecer no Android quando você está tentando carregar uma biblioteca que foi compilada no JDK da Oracle.
Aqui está o problema do cliente HTTP do Ning Async.
fonte
No meu caso, tive que remover este bloco:
Ele estava mostrando um erro próximo à
Fragment.showDialog()
chamada do método.fonte
Exemplo mínimo que gera o erro
Uma possibilidade simples é usar o Jasmin ou editar manualmente o bytecode com um editor de arquivo binário.
Vamos criar o
void
método sem umareturn
instrução (gerada pelareturn;
instrução em Java), que a JVMS diz ser ilegal.Em Jasmin, poderíamos escrever:
Em seguida, fazemos
javac Main.j
ejavap -v Main
diz que compilamos:então realmente não há instruções de retorno.
Agora, se tentarmos executar
java Main
, obtemos:Esse erro nunca pode ocorrer normalmente em Java, pois o compilador Java adiciona um implícito
return
aosvoid
métodos para nós. É por isso que não precisamos adicionar areturn
aos nossosmain
métodos. Você pode verificar isso comjavap
.JVMS
VerifyError acontece quando você tenta executar certos tipos de arquivo de classe ilegal, conforme especificado pelo JVMS 7, capítulo 4.5
A JVMS diz que, quando Java carrega um arquivo, ele deve executar uma série de verificações para verificar se o arquivo de classe está OK antes de executá-lo.
Esses erros não podem ser gerados em um único ciclo de compilação e execução de código Java, porque o JVMS 7 4.10 diz :
Portanto, para ver um exemplo de falha mínima, precisaremos gerar o código fonte sem
javac
.fonte
Esta página pode fornecer algumas dicas - http://www.zanthan.com/itymbi/archives/000337.html
Pode haver um bug sutil no corpo desse método que o javac não consiga detectar. Difícil de diagnosticar, a menos que você publique todo o método aqui.
Você pode começar declarando o maior número possível de variáveis como final ... isso teria detectado o bug mencionado no site zanthan e, geralmente, é uma boa prática.
fonte
Bem, no meu caso, meu projeto A dependia de outro, digamos X (A estava usando algumas das classes definidas em X). Então, quando adicionei o X como um projeto de referência no caminho de construção de A, recebi esse erro. No entanto, quando removi o X como o projeto referenciado e incluí o frasco do X como uma das bibliotecas, o problema foi resolvido.
fonte
Verifique se há várias versões do mesmo arquivo jar no seu caminho de classe.
Por exemplo, eu tinha o opennlp-tools-1.3.0.jar e o opennlp-tools-1.5.3.jar no meu caminho de classe e obtive esse erro. A solução foi excluir o opennlp-tools-1.3.0.jar.
fonte
O CGLIB <2.2 com JRE> 6 pode disparar erros semelhantes, consulte "Devo atualizar para o CGLIB 3.0?" e alguns comentários no Spring SPR-9669 .
Isso é especialmente verdade quando tudo funciona bem no JRE 6 e simplesmente mudar para o JRE7 quebra as coisas.
fonte
Outro motivo para esse erro pode ser a combinação de AspectJ <= 1.6.11 com JRE> 6.
Consulte o Eclipse Bug 353467 e o bilhete Kieker 307 para obter detalhes.
Isso é especialmente verdade quando tudo funciona bem no JRE 6 e a mudança para o JRE7 quebra as coisas.
fonte
Isso também pode acontecer quando você tem muitas importações de módulos com o maven. Haverá duas ou mais classes com exatamente o mesmo nome (mesmo nome qualificado). Este erro é resultante da diferença de interpretação entre o tempo de compilação e o tempo de execução.
fonte
Se você estiver migrando para o java7 ou usando o java7, geralmente esse erro pode ser visto. Eu enfrentei os erros acima e lutei bastante para descobrir a causa raiz. Sugiro tentar adicionar o argumento da JVM "-XX: -UseSplitVerifier" durante a execução do aplicativo.
fonte
Após a atualização
Gradle
no Android Studio 3.6.1, ocorreram falhas na API 19 na compilação da versão.Ocorreu um erro na
Glide
biblioteca . A solução é reescrever proguard-rules.txt .Também desclassificar o
Gradle
works (classpath 'com.android.tools.build:gradle:3.5.3'
), mas é uma solução desatualizada, não a use.fonte
Embora o motivo mencionado por Kevin esteja correto, mas eu definitivamente verificaria abaixo antes de passar para outra coisa:
cglibs
no meu caminho de classe.hibernate
versões no meu caminho de classe.É provável que uma versão múltipla ou conflitante de qualquer uma das opções acima possa causar problemas inesperados, como o que está em questão.
fonte
java.lang.VerifyError significa que o código de código compilado está se referindo a algo que o Android não consegue encontrar. Este confirmError emite-me apenas com kitkat4.4 e versão inferior que não está na versão acima, mesmo que eu executei a mesma compilação nos dois dispositivos. quando usei o analisador jackson json da versão anterior, ele mostra java.lang.verifyerror
Então eu mudei a Dependency para a versão mais recente 2.2 para 2.7 sem a biblioteca principal , e então ela funciona. o que significa que os métodos e outros conteúdos do núcleo são migrados para a versão mais recente do Databind2.7 . Isso corrige meus problemas.
fonte
remova qualquer arquivo jar inutilizável e tente executar. e seu trabalho para mim, eu adicionei um arquivo jar jcommons e também outro arquivo jar jcommons.1.0.14, para remover o jcommons e seu trabalho para mim
fonte
escreva no arquivo:
em dependências a seguir:
<module name="sun.jdk"/>
fonte
No meu caso, eu estava recebendo um erro de verificação com o rastreamento de pilha abaixo
Eu o resolvi removendo a entrada do caminho de classe para commons-codec-1.3.jar; havia uma incompatibilidade na versão deste jar com a que acompanha o Jasper.
fonte