Java.lang.VerifyError: ожидание фрейма стека в целевой ветке JDK 1.7
После перехода на 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)
Ответы
Ответ 1
В Java 7 была введена более строгая проверка и был изменен формат класса bit — чтобы содержать карту стека, используемую для проверки правильности кода. Исключение, которое вы видите, означает, что какой-либо метод не имеет допустимой карты стека.
Можно было обвинять версию Java или байт-код. Обычно это означает, что библиотека, используемая приложением, генерирует недопустимый байт-код, который не проходит более строгую проверку. Поэтому ничто иное, как сообщение об этом как об ошибке в библиотеке, может быть сделано разработчиком.
В качестве обходного пути вы можете добавить -noverify
к аргументам JVM, чтобы отключить проверку. В Java 7 также можно было использовать -XX:-UseSplitVerifier
для использования менее строгой проверки, но эта опция была удалена в Java 8.
Ответ 2
Если вы используете java 1.8, удалите XX:-UseSplitVerifier
и используйте -noverify
в своих свойствах JVM.
Ответ 3
Я столкнулся с этой проблемой и попытаюсь использовать флаг -noverify
, который действительно работает. Это из-за нового верификатора байт-кода. Значит, флаг должен действительно работать.
Я использую JDK 1.7.
Примечание. Это не сработает, если вы используете JDK 1.8
Ответ 4
Единственное различие между файлами, которые вызывают проблему, это 8-й байт файла
CA FE BA BE 00 00 00 33 - Java 7
против.
CA FE BA BE 00 00 00 32 - Java 6
Настройка -XX:-UseSplitVerifier
устраняет проблему. Однако причиной этой проблемы является https://bugs.eclipse.org/bugs/show_bug.cgi?id=339388
Ответ 5
Передайте аргумент JVM -noverify
в тестовую задачу. Если вы используете gradle, в build.gradle
вы можете иметь что-то вроде:
test {
jvmArgs "-noverify"
}
Ответ 6
Извините за копание, но я встретил ту же проблему и нашел более простое решение.
В параметрах компилятора Java вам необходимо снять флажок "Сохранять неиспользуемые (никогда не читаемые) локальные переменные" , поэтому нет необходимости менять обратно целевую версию JVM.
Кажется, это ошибка в более старых версиях Eclipe.
Ответ 7
Если вы сами создаете код, эту проблему можно преодолеть, предоставив jQuery-компилятор "-target 1.5" (или установив соответствующий параметр в вашей среде IDE или вашей конфигурации сборки).
Ответ 8
эта ссылка полезна.
java.lang.VerifyError: ожидание кадра стека
Самый простой способ - изменить JRE на 6.