2016-10-14 5 views
1

Я прошу и отвечу на этот вопрос, чтобы спасти меня от дальнейшего снижения этой крысиной дыры в будущем.Почему мой развернутый плагин eclipse генерирует исключение NoClassDefFoundError?

Я создаю кросс-платформу для создания затмений среды разработки на основе IDE с примерно 40 плагинами. Когда я установил последнюю ночную сборку и сделал некоторые тесты в своей тестовой системе Linux, приложение начало бросать ужасный java.lang.NoClassDefFoundError, когда я сделал определенное действие. Этого не происходило при установке Windows. Это не произошло в моей среде разработки в Linux или Windows. Это действие и код, стоящий за ним, являются новыми и поэтому еще не охвачены в нашем автоматизированном наборе тестов.

Плагин, исключающий исключение, пытался получить доступ к статическому методу класса в другом плагине, но не смог найти класс. Вещи, которые я пробовал:

  1. Первоначальная мысль: статический инициализатор не работает по какой-либо причине! Неа. Я вижу, что другие плагины получают доступ к этому статическому классу и методам до сбоя (присоединяя мой отладчик к установленному экземпляру моего продукта и выполняя код).

  2. Тот факт, что он работает с другими плагинами, устраняет другую обычную причину отказа, неправильно экспортируя пакет. Он был экспортирован правильно.

  3. Я выложил свой список зависимостей плагинов, сравнив их с плагинами, которые смогли получить доступ к классу-нарушителю, но без успеха. Все зависимости были учтены.

  4. Я глубоко погрузился в свой MANFEST.MF. Я переключился с «Обязательный набор» на «Импорт-пакет» в MANIFEST.MF. Это создало для меня новые проблемы, поэтому я изменил это изменение. Все выглядело хорошо.

  5. Мои объекты build.properties выглядели хорошо. Не слишком много, чтобы пойти не так. Это соответствовало моему MANFIEST.MF, где оно рассчитывает.

  6. Я деконструировал свой плагин на установленном экземпляре, чтобы убедиться, что класс действительно присутствует. Это было.

Все настроено правильно. Все!

Я выложил много связанных вопросов и сообщений в блоге, но ни один из них не предложил решение, которое сработало или какое-либо дополнительное понимание проблемы.

Следующим шагом было начать итерацию по моим ночным сборкам, чтобы найти сборку, в которой впервые появилась проблема. После того, как я идентифицирую эту сборку, я смогу повторить все коммиты с предыдущего дня, выполнив полные сборки, а затем установит, чтобы найти фиксацию, которая сломала ее.

Я начал работу за 10 дней и установил каждую ночную сборку. Весь путь до сборки, которая не удалась в моей тестовой среде. Каждый из них работал. Зачем?. См. Мой ответ ниже (или подайте свое собственное).

ответ

1

При тестировании новой сборки IDE Eclipse убедитесь, что вы начинаете с нового нового несуществующего каталога рабочей области и используете параметр командной строки «-clean», чтобы очистить любые кеши, которые выходят из предыдущей установки.

Ошибка произошла, поскольку я (1) не удалил предыдущий каталог рабочей области перед запуском приложения; и (2) не использовал параметр командной строки «-clean» для удаления связанной кешированной информации; и (3) даже «-clean» может быть недостаточно, я также удалил весь каталог приложений (который, в свою очередь, удалил каталог «configuration» и все кэшированные данные внутри него, возможно, не были «очищены» с помощью " -clean "аргумент командной строки).

Я имел рефакторинг нескольких имен классов, чтобы иметь более значимые имена. Когда я запускал продукт с существующей средой, продукт использовал кешированные данные, получая старое имя класса, который был переименован, и не смог его решить. (Вы можете подумать, что увидеть старое имя было хорошей подсказкой, но, к сожалению, одна из первых вещей, которые я пробовал, это отмена рефакторинга имени класса, таким образом, восстановление прежнего имени. Таким образом, ошибка сообщила правильное имя, но, я подозреваю , есть подпись, которая не разрешилась.)

Конечно, лучше всего начинать работу с новой рабочей области при тестировании. Я много лет занимаюсь разработкой Eclipse IDE, и я это хорошо знаю. Но вчера я забыл (не помог тот факт, что моя установка Windows не понесла ту же ошибку по любой причине). Иногда вы забудете ... и он вас укусит.

Смежные вопросы