java.lang.VerifyError: शाखा लक्ष्य JDK 1.7 पर स्टैकेम्प फ्रेम की अपेक्षा


88

JDK 1.7 में अपग्रेड करने के बाद मुझे नीचे अपवाद मिल रहा है:

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)

जवाबों:


171

जावा 7 ने सख्त सत्यापन की शुरुआत की और उस कोड को सही करने के लिए उपयोग किए गए स्टैक मैप को शामिल करने के लिए वर्ग प्रारूप को थोड़ा बदल दिया। आपके द्वारा देखे गए अपवाद का अर्थ है कि कुछ विधि में मान्य स्टैक मैप नहीं है।

जावा संस्करण या बाईटेकोड इंस्ट्रूमेंटेशन दोनों को दोष दिया जा सकता है। आमतौर पर इसका मतलब है कि एप्लिकेशन द्वारा उपयोग की जाने वाली लाइब्रेरी अमान्य बायटेकोड उत्पन्न करती है जो सख्त सत्यापन को पास नहीं करती है। इसलिए इसे एक बग के रूप में लाइब्रेरी में रिपोर्ट करने के अलावा और कुछ नहीं किया जा सकता है।

वर्कअराउंड के रूप में आप -noverifyसत्यापन को अक्षम करने के लिए JVM तर्कों में जोड़ सकते हैं । जावा 7 -XX:-UseSplitVerifierमें कम सख्त सत्यापन विधि का उपयोग करना भी संभव था , लेकिन जावा 8 में उस विकल्प को हटा दिया गया।


1
लेकिन क्या करता है -XX: -UseSplitVerifier का मतलब है ?? मैंने ओरेकल के स्पष्टीकरण पर ध्यान दिया, यह कहता है "स्टैकेपबल विशेषताओं के साथ नए प्रकार के चेकर का उपयोग करें"। मुझे नहीं मिला।
जॉन

2
इसलिए अगर मुझे यह त्रुटियां दिखाई देती हैं: क्या यह JVM या मेरे कोड के भीतर एक बग है?
बेंटोलर

4
यह उत्तर लंबे शब्दों में मान्य नहीं है, या शायद अब पहले से ही है, क्योंकि ओरेकल इस विकल्प को हटा रहा है। मैं इस बग (अन्य कोड के साथ) से पीड़ित हूं और स्टैकमैप के पुनर्निर्माण के लिए एक रास्ता तलाश रहा हूं
ZiglioUK

2
यूनिट टेस्ट के लिए आपको अचूक प्लगइन में तर्क पारित करना होगा। इसने java 7 और 8 दोनों कंपाइलरों के लिए समस्या तय की: <plugin> <groupId> org.apache.maven.plugins </ groupId> <विरूपण साक्ष्य> maven-Surefire-plugin </ विरूपण साक्ष्य> <संस्करण> 2.18.1 </ version > <कॉन्फ़िगरेशन> <argLine> -noverify -XX: -UseSplitVerifier </ argLine> </ कॉन्फ़िगरेशन> </ plugin>
एंटोनी विल्स

2
मैं एक ही मुद्दे का सामना कर रहा था, लेकिन जोड़ने के बाद-यह वास्तव में मेरे लिए काम किया। धन्यवाद।
प्रवीण कुमार मेकला

15

यदि आप जावा 1.8 का उपयोग कर रहे हैं, तो अपने जेवीएम गुणों को निकालें XX:-UseSplitVerifierऔर उपयोग -noverifyकरें।


8

मैं इस समस्या में भाग गया और ध्वज का उपयोग करने का प्रयास किया -noverifyजो वास्तव में काम करता है। इसकी वजह है नया बायोटेक वेरिफायर। इसलिए झंडा वास्तव में काम करना चाहिए। मैं JDK 1.7 का उपयोग कर रहा हूं।

नोट: यदि आप JDK 1.8 का उपयोग कर रहे हैं तो यह काम नहीं करेगा


3
मेरे लिए एक रनटाइम के रूप में JRE 8 का उपयोग करके हमारे एंड्रॉइड यूनिट टेस्ट को निष्पादित करने वाले ध्वज को निर्धारित करना।
ubuntudroid

2
-noverify ने मेरे लिए Java 8 पर भी काम किया। मैं एंड्रॉइड के लिए ग्रेडेल का उपयोग कर रहा हूं और इसलिए मुझे -noverify फ्लैग लगाना पड़ा, जहां stackoverflow.com/a/37593189/2848676 में निर्दिष्ट किया गया है
Michael Osofsky

आपने कहाँ स्थापित किया? मैंने इसे MAVEN_OPTS के रूप में सेट किया, लेकिन इसके लिए मेरे लिए काम नहीं कर रहा था
dev

@Sara Antunez, एंड्रॉइड क्लोजर में आपके एप्लिकेशन मॉड्यूल 'build.gradle फ़ाइल में, इसे जोड़ें। Android {.... परीक्षण {यूनिटटैस्ट .all {jvmArgs '-noverify'}}}
GrokkingDroid

2

फ़ाइलों के बीच एकमात्र अंतर जो समस्या का कारण है, फ़ाइल की 8 वीं बाइट है

सीए फे बीए बीई 00 00 00 33 - जावा 7

बनाम

CA FE BA BE 00 00 00 32 - जावा 6

सेटिंग -XX:-UseSplitVerifierसमस्या का समाधान करता है। हालाँकि, इस मुद्दे का कारण https://bugs.eclipse.org/bugs/show_bug.cgi?id=333388 है


2

-noverifyअपने परीक्षण कार्य के लिए जेवीएम तर्क पास करें। यदि आप ग्रेडिंग का उपयोग कर रहे हैं, तो build.gradleआपके पास कुछ इस तरह हो सकता है:

test {
  jvmArgs "-noverify"
}

0

यह ERROR तब हो सकता है जब आप Mockito का उपयोग अंतिम कक्षाओं का मजाक उड़ाने के लिए करते हैं

इसके बजाय मॉकिटो इनलाइन या पावरमॉक का उपयोग करने पर विचार करें।


-1

खुदाई के लिए खेद है, लेकिन मैं एक ही समस्या से मिला और सरल समाधान पाया।

जावा संकलक विकल्पों में आपको "अप्रयुक्त संरक्षित (कभी नहीं पढ़ें) स्थानीय चर" को अनचेक करने की आवश्यकता है होती है, इसलिए बैक वीट जेवीएम संस्करण को बदलने की कोई आवश्यकता नहीं है।

यह पुराने Eclipe संस्करणों में एक बग लगता है।


यह मेरे लिए काम नहीं करता है। यहाँ मेरी त्रुटि का एक सार है: gist.github.com/ZiglioNZ/bd1d7d424727b3f26c64
ZiglioUK

3
ओपी ग्रहण का उल्लेख नहीं करता है। हो सकता है वह इसका इस्तेमाल भी न कर रहा हो।
डॉन ब्रैनसन

-3

यदि आप स्वयं कोड का निर्माण कर रहे हैं, तो यह समस्या जावा कंपाइलर (या आपके IDE या आपके बिल्ड कॉन्फिगर में संबंधित विकल्प को सेट करके) को "-target 1.5" देकर दूर किया जा सकता है।


-11

यह लिंक सहायक है। java.lang.VerifyError: स्टैकैम्प फ्रेम की अपेक्षा

सबसे आसान तरीका है JRE को 6 में बदलना।


7
जब एक साधारण JVM arg ठीक हो सकता है तो अपग्रेड करना? मुझे आपकी सरल की परिभाषा पर संदेह है।
दूरदर्शी सॉफ्टवेयर समाधान

1
जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
जोआचिम सौअर

यह चारों ओर का काम है। जैसा कि जोआचिम ने कहा, यह काम कर सकता है - लेकिन यह टीम या कोड बेस के लिए समस्या या सहायता को परिभाषित नहीं करता है जो जावा 7
पॉली का

जुड़े हुए प्रश्न में कई उत्तर हैं। डाउनग्रेडिंग केवल एक सूचीबद्ध विकल्प है।
ओगरे Psalm33
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.