Java 7 JVM VerifyError в Eclipse
Когда я компилирую свой проект в eclipse indigo, используя JDK 7, я получаю следующее сообщение об ошибке
со следующей трассировкой стека
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 32 in method ... at offset 0
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Я нашел соответствующую ошибку здесь и использовал предложенный обходной путь использования опции jvm -XX:-UseSplitVerifier
и хотя это работает, эта ошибка все еще смущает меня.
Кто-нибудь знает, почему это происходит и почему обходной путь... работает?
--Заметка--
Проект прекрасно компилируется с использованием JDK 6.
5 ответов
Ошибка 353467 говорит об "использовании -XX:-UseSplitVerifier
активировать старый верификатор ".
Это согласуется с Руководством по внедрению JDK TM 6, в котором этот вариант описывается следующим образом:
Традиционный верификатор может быть принудительно
-XX:-UseSplitVerifier
флаг.Отсутствует или неверный
StackMapTable
атрибуты для версии50.0
файлы классов могут привести кVerifyError
исключения.
Инструменты, которые переписывают байт-код в версии50.0
файлы классов и не правильно обновлятьStackMapTable
может быть не в состоянии проверить и вызвать исключения.
Таким образом, комментарий от 2011-10-03 указывает на то, что:
AspectJ теперь автоматически активирует ранее необязательный параметр для создания стековых карт, если классы являются Java7.
Когда у меня возникла эта проблема, я исправил ее, удалив системные библиотеки JDK 1.7 из проекта, и вместо этого добавил библиотеки 1.6 JDK. Я пошел, чтобы запустить проект снова, и я не получил ошибку. Когда я снова добавил библиотеки JDK 1.7, он все еще работает, поэтому что-то в "замене" заставляет его работать.
mre, вы можете поделиться своим исходным кодом (или извлеченным примером), который показывает эту ошибку при запуске? Я считаю, что это ошибка в Java-компиляторе eclipse и должна быть исправлена.
Пожалуйста, откройте ошибку в eclipse bugzilla, если вы можете предоставить пример кода.
В настоящее время моя среда - jdk 1.7(j2sdk 1.7, обновление 21) с eclipse 4.2 juno (SR2) У меня была такая же проблема, поэтому я исправил ее, настроив аргументы виртуальной машины Option '-XX:-UseSplitVerifier', но это вызвало большие проблемы, когда я развернет продукт на основе google-app-engine.
наконец я изменил Java 6 (обновление 43)
Я столкнулся с этой проблемой в Juno, но решил ее, установив последнюю версию 4.2 с сайта обновления 4.2 здесь:
http://www.eclipse.org/ajdt/downloads/
Это то же самое, что @VonC дал год назад - но поскольку обновленный AspectJ уже есть (но не в последнем репозитории Juno и не в том, что поставляется со Spring), он теперь представляет собой ответ.
Но заслуга @VonC.
Обратите внимание, что это должно работать как для 3.8, так и для 4.2.