java.lang.VerifyError: Esperando um quadro de mapa de pilha no destino de ramificação JDK 1.7


88

Depois de atualizar para JDK 1.7, estou recebendo a seguinte exceção:

java.lang.VerifyError: Expecting a stackmap frame at branch target 71 in method com.abc.domain.myPackage.MyClass$JaxbAccessorM_getDescription_setDescription_java_lang_String.get(Ljava/lang/Object;)Ljava/lang/Object; at offset 20
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2413)
    at java.lang.Class.getConstructor0(Class.java:2723)
    at java.lang.Class.newInstance0(Class.java:345)
    at java.lang.Class.newInstance(Class.java:327)
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:184)
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:129)
    at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$GetterSetterReflection.optimize(Accessor.java:384)
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.java:72)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113)
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:494)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:311)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at com.abc.domain.myPackage.MyClass.marshalFacetsTest(MyClass.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:128)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1203)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1128)
    at org.testng.TestNG.run(TestNG.java:1036)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

Respostas:


171

Java 7 introduziu uma verificação mais rígida e alterou um pouco o formato da classe - para conter um mapa de pilha usado para verificar se o código está correto. A exceção que você vê significa que algum método não tem um mapa de pilha válido.

A versão Java ou a instrumentação de bytecode podem ser as culpadas. Normalmente, isso significa que uma biblioteca usada pelo aplicativo gera bytecode inválido que não passa na verificação mais rígida. Portanto, nada mais do que relatá-lo como um bug para a biblioteca pode ser feito pelo desenvolvedor.

Como alternativa, você pode adicionar -noverifyargumentos JVM para desativar a verificação. No Java 7 também era possível -XX:-UseSplitVerifierusar o método de verificação menos estrito, mas essa opção foi removida no Java 8.


1
Mas o que significa -XX: -UseSplitVerifier ?? Eu olhei a explicação do oracle, ela diz "Use o novo verificador de tipo com atributos StackMapTable". Eu não entendi.
João

2
Portanto, se eu vir estes erros: Isso é um bug no JVM ou no meu código?
bentolor

4
esta resposta não é válida a longo prazo, ou talvez já não seja válida, pois a Oracle está descontinuando essa opção. Estou afligido por este bug (com outro código) e estou procurando uma maneira de reconstruir os mapas de pilha
ZiglioUK

2
para o teste de unidade, você deve passar os argumentos no plugin surefire. Isso corrigiu o problema para os compiladores java 7 e 8: <plugin> <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-surefire-plugin </artifactId> <version> 2.18.1 </ version > <configuration> <argLine> -noverify -XX: -UseSplitVerifier </argLine> </configuration> </plugin>
Antoine Wils

2
Eu estava enfrentando o mesmo problema, mas depois de adicionar -noverify realmente funcionou para mim.
Praveen Kumar Mekala

15

Se você estiver usando java 1.8, remova XX:-UseSplitVerifiere use -noverifyem suas propriedades JVM.


8

Corri para este problema e tentei usar o sinalizador -noverifyque realmente funciona. É por causa do novo verificador de bytecode. Portanto, a bandeira deve realmente funcionar. Estou usando o JDK 1.7.

Nota: Isso não funcionaria se você estiver usando JDK 1.8


3
Para mim, usando o sinalizador corrigido executando nossos testes de unidade Android usando JRE 8 como um tempo de execução.
ubuntudroid

2
-noverify também funcionou para mim em Java 8. Estou usando gradle para Android e, portanto, tive que colocar o sinalizador -noverify onde especificado em stackoverflow.com/a/37593189/2848676
Michael Osofsky

onde você definiu -noverify? Eu defini como MAVEN_OPTS, mas não está funcionando para mim
dev

@Sara Antunez, No arquivo build.gradle dos módulos do seu aplicativo no fechamento do Android, adicione isso. android {.... testOptions {unitTests.all {jvmArgs '-noverify'}}}
GrokkingDroid


2

Passe o -noverifyargumento JVM para sua tarefa de teste. Se você estiver usando o Gradle, no build.gradlepode ter algo como:

test {
  jvmArgs "-noverify"
}

0

Este ERRO pode acontecer quando você usa o Mockito para simular as aulas finais .

Considere usar Mockito inline ou Powermock.


-1

Desculpe por cavar, mas encontrei o mesmo problema e encontrei a solução mais simples.

Nas opções do compilador Java, você precisa desmarcar "Preservar variáveis ​​locais não utilizadas (nunca ler)" para que não haja necessidade de alterar a versão de destino da JVM.

Parece ser um bug em versões mais antigas do Eclipe.


não funciona para mim. Aqui está um resumo
ZiglioUK

3
O OP não menciona Eclipse. Ele pode nem mesmo estar usando.
Don Branson

-3

Se você estiver construindo o código por conta própria, esse problema pode ser resolvido fornecendo "-target 1.5" ao compilador java (ou definindo a opção correspondente em seu IDE ou configuração de construção).


-11

este link é útil. java.lang.VerifyError: Esperando um quadro de mapa de pilha

a maneira mais simples é alterar o JRE para 6.


7
fazer downgrade quando um argumento JVM simples pode corrigir? Duvido da sua definição de simples.
Visionary Software Solutions

1
Embora isso possa teoricamente responder à pergunta, seria preferível incluir as partes essenciais da resposta aqui e fornecer o link para referência.
Joachim Sauer

Esta é uma solução alternativa. Como Joachim disse, pode funcionar - mas não define o problema ou ajuda para equipes ou bases de código que devem usar Java 7
Crowie

Existem várias respostas na pergunta vinculada. O downgrade é apenas uma das opções listadas.
Ogre Salm33
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.