Я прошу и отвечу на этот вопрос, чтобы спасти меня от дальнейшего снижения этой крысиной дыры в будущем.Почему мой развернутый плагин eclipse генерирует исключение NoClassDefFoundError?
Я создаю кросс-платформу для создания затмений среды разработки на основе IDE с примерно 40 плагинами. Когда я установил последнюю ночную сборку и сделал некоторые тесты в своей тестовой системе Linux, приложение начало бросать ужасный java.lang.NoClassDefFoundError, когда я сделал определенное действие. Этого не происходило при установке Windows. Это не произошло в моей среде разработки в Linux или Windows. Это действие и код, стоящий за ним, являются новыми и поэтому еще не охвачены в нашем автоматизированном наборе тестов.
Плагин, исключающий исключение, пытался получить доступ к статическому методу класса в другом плагине, но не смог найти класс. Вещи, которые я пробовал:
Первоначальная мысль: статический инициализатор не работает по какой-либо причине! Неа. Я вижу, что другие плагины получают доступ к этому статическому классу и методам до сбоя (присоединяя мой отладчик к установленному экземпляру моего продукта и выполняя код).
Тот факт, что он работает с другими плагинами, устраняет другую обычную причину отказа, неправильно экспортируя пакет. Он был экспортирован правильно.
Я выложил свой список зависимостей плагинов, сравнив их с плагинами, которые смогли получить доступ к классу-нарушителю, но без успеха. Все зависимости были учтены.
Я глубоко погрузился в свой MANFEST.MF. Я переключился с «Обязательный набор» на «Импорт-пакет» в MANIFEST.MF. Это создало для меня новые проблемы, поэтому я изменил это изменение. Все выглядело хорошо.
Мои объекты build.properties выглядели хорошо. Не слишком много, чтобы пойти не так. Это соответствовало моему MANFIEST.MF, где оно рассчитывает.
Я деконструировал свой плагин на установленном экземпляре, чтобы убедиться, что класс действительно присутствует. Это было.
Все настроено правильно. Все!
Я выложил много связанных вопросов и сообщений в блоге, но ни один из них не предложил решение, которое сработало или какое-либо дополнительное понимание проблемы.
Следующим шагом было начать итерацию по моим ночным сборкам, чтобы найти сборку, в которой впервые появилась проблема. После того, как я идентифицирую эту сборку, я смогу повторить все коммиты с предыдущего дня, выполнив полные сборки, а затем установит, чтобы найти фиксацию, которая сломала ее.
Я начал работу за 10 дней и установил каждую ночную сборку. Весь путь до сборки, которая не удалась в моей тестовой среде. Каждый из них работал. Зачем?. См. Мой ответ ниже (или подайте свое собственное).