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.

Другие вопросы по тегам