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)
John
fonte

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.

Mirko Adari
fonte
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.

Anand Kumar KK
fonte
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

Charan Raj
fonte
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

A única diferença entre os arquivos que está causando o problema é o 8º byte do arquivo

CA FE BA BE 00 00 00 33 - Java 7

vs.

CA FE BA BE 00 00 00 32 - Java 6

A configuração -XX:-UseSplitVerifierresolve o problema. No entanto, a causa desse problema é https://bugs.eclipse.org/bugs/show_bug.cgi?id=339388

Um Kunin
fonte
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"
}
Leo
fonte
0

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

Considere usar Mockito inline ou Powermock.

nhoxbypass
fonte
-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.

Scoro
fonte
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).

jrajp2184
fonte
-11

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

a maneira mais simples é alterar o JRE para 6.

Yuxiaomin
fonte
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