java.lang.VerifyError: JDK 1.7 şube hedefinde bir yığın eşleme çerçevesi bekleniyor


88

JDK 1.7'ye yükselttikten sonra istisnanın altına düşüyorum:

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)

Yanıtlar:


171

Java 7, daha katı bir doğrulama getirdi ve sınıf biçimini biraz değiştirdi — kodun doğru olduğunu doğrulamak için kullanılan bir yığın eşlemi içerecek şekilde. Gördüğünüz istisna, bazı yöntemlerin geçerli bir yığın haritasına sahip olmadığı anlamına gelir.

Java sürümü veya bayt kodu enstrümantasyonu her ikisi de suçlu olabilir. Genellikle bu, uygulama tarafından kullanılan bir kitaplığın, daha katı doğrulamayı geçmeyen geçersiz bayt kodu ürettiği anlamına gelir. Dolayısıyla, geliştirici tarafından kütüphaneye bir hata olarak bildirmekten başka hiçbir şey yapılamaz.

Geçici bir çözüm -noverifyolarak, doğrulamayı devre dışı bırakmak için JVM bağımsız değişkenlerine ekleyebilirsiniz . Java 7'de -XX:-UseSplitVerifierdaha az katı olan doğrulama yöntemini kullanmak da mümkündü , ancak bu seçenek Java 8'de kaldırıldı.


1
Ama -XX: -UseSplitVerifier ne anlama geliyor? Oracle'ın açıklamasına baktım, "StackMapTable öznitelikleriyle yeni tür denetleyicisini kullan" diyor. Ben anlamadım.
John

2
Yani şu hataları görürsem: Bu JVM içinde bir hata mı yoksa kodum mu?
bentolor

4
Oracle bu seçeneği kullanımdan kaldırdığı için bu cevap uzun vadede veya belki de artık geçerli değildir. Bu hatadan etkilendim (başka bir kodla) ve yığın haritalarını yeniden oluşturmanın bir yolunu arıyorum
ZiglioUK

2
birim testi için surefire eklentisindeki argümanları geçmelisiniz. Bu, hem java 7 hem de 8 derleyiciler için sorunu çözdü: <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
aynı sorunla karşı karşıyaydım ama -noverify ekledikten sonra gerçekten işe yaradı. teşekkürler.
Praveen Kumar Mekala

15

Java 1.8 XX:-UseSplitVerifierkullanıyorsanız -noverify, JVM özelliklerinizde kaldırın ve kullanın .


8

Bu problemle karşılaştım ve -noverifygerçekten işe yarayan bayrağı kullanmayı denedim . Bunun nedeni, yeni bayt kodu doğrulayıcıdır. Yani bayrak gerçekten işe yaramalı. JDK 1.7 kullanıyorum.

Not: JDK 1.8 kullanıyorsanız bu işe yaramaz.


3
Benim için, çalışma zamanı olarak JRE 8 kullanarak Android Birim Testlerimizi yürütürken düzeltilen bayrağı kullanıyorum.
ubuntudroid

2
-noverify benim için Java 8'de de çalıştı. Android için gradle kullanıyorum ve bu nedenle stackoverflow.com/a/37593189/2848676'da belirtilen yere -noverify bayrağını
koymam gerekti

-noverify'ı nereye ayarladınız? MAVEN_OPTS olarak ayarladım ama benim için çalışmıyor
dev

@Sara Antunez, uygulama modüllerinizin 'build.gradle dosyasında android kapamada bunu ekleyin. android {.... testOptions {unitTests.all {jvmArgs '-noverify'}}}
GrokkingDroid


2

Geçmek -noverify test göreve JVM argüman. Gradle kullanıyorsanız, build.gradleaşağıdaki gibi bir şeye sahip olabilirsiniz:

test {
  jvmArgs "-noverify"
}

0

Bu HATA, Mockito'yu son sınıflarla dalga geçmek için kullandığınızda meydana gelebilir .

Bunun yerine Mockito inline veya Powermock kullanmayı düşünün.


-2

Kazdığım için üzgünüm ama aynı problemle karşılaştım ve daha basit çözümü buldum.

Java derleyici seçeneklerinde "Kullanılmayan (asla okumayan) yerel değişkenleri koru" seçeneğinin işaretini kaldırmanız gerekir. böylece hedef JVM sürümünü geri değiştirmenize gerek yoktur.

Eski Eclipe sürümlerinde bir hata gibi görünüyor.


benim için çalışmıyor. İşte hatamın
ZiglioUK

3
OP, Eclipse'den bahsetmiyor. Kullanmıyor bile olabilir.
Don Branson 13

-4

Kodu kendiniz oluşturuyorsanız, bu sorun java derleyicisine "-target 1.5" verilerek (veya IDE'nizde veya derleme yapılandırmanızda ilgili seçeneği ayarlayarak) çözülebilir.


-11

bu bağlantı faydalıdır. java.lang.VerifyError: Yığın eşleme çerçevesi bekleniyor

en basit yol JRE'yi 6 olarak değiştirmektir.


7
basit bir JVM argümanı düzeltilebildiğinde eski sürüme mi geçiliyor? Basit tanımından şüpheliyim.
Visionary Software Solutions

1
Bu teorik olarak soruya cevap görülebilir fakat tercih edildiğini burada cevabın temel parçalarını kapsadığı ve başvuru için bağlantı sağlar.
Joachim Sauer

Bu etrafta bir çalışma. Joachim'in dediği gibi, işe yarayabilir - ancak sorunu tanımlamaz veya Java 7 kullanması gereken ekipler veya kod tabanları için yardımcı olmaz
Crowie

Bağlantılı soruda birden fazla cevap var. Sürüm düşürme, listelenen seçeneklerden yalnızca biridir.
Ogre Mezmur 33
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.