Как решить ClassNotFoundException в сборке eclipse rcp?

Я создал проект функции eclipse в eclipse juno, и когда я запускаю программу из IDE, все в порядке, в консоли нет ошибок.

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

!ENTRY org.eclipse.e4.ui.workbench 4 0 2012-07-19 19:22:13.859
MESSAGE Unable to load class 'be.yt.diepvriezer.ui.handlers.ExitHandler' from bundle '2'

!ENTRY org.eclipse.e4.ui.workbench 4 0 2012-07-19 19:22:13.859 !СООБЩЕНИЕ Невозможно загрузить класс 'be.yt.diepvriezer.ui.handlers.ExitHandler' из пакета '2' !STACK 0 java.lang.ClassNotFoundException: be.yt.diepvriezer.ui.handlers.ExitHandler в org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501) в org.eclipse.osgi.internal.loader.BundleLoader .findClass(BundleLoader.java:421) в org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) в org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) ) в java.lang.ClassLoader.loadClass(ClassLoader.java:247) .....

И так для каждого обработчика и части, которую я создал в модели приложения.

Я проверил файлы build.properties и manifest, и все там.

Может ли кто-нибудь указать мне правильное направление, как решить эту проблему, пожалуйста?


person Yves_T    schedule 19.07.2012    source источник


Ответы (2)


Нет решения, просто нужно проверить:

Когда вы смотрите на подкаталог plugins/ экспортированного продукта, содержит ли он плагин для вашего be.yt.diepvriezer.ui.handlers.ExitHandler? Если нет, этот плагин необходимо добавить в продукт. Когда вы запускаете продукт RCP из IDE, обычно включаются все плагины в рабочей области, но когда вы экспортируете продукт, вам действительно нужно перечислить все плагины, которые вы действительно хотите включить в файл *.product (напрямую или через *.features)

Когда вы распаковываете этот jar-файл плагина, действительно ли там находится класс ...ExitHandler? Если нет, что-то не удалось в экспорте продукта.

Является ли Application.e4xmi ссылкой на ваш ..ExitHandler в том же плагине, что и код? Если нет, то код в «другом» плагине, который предоставляет ..ExitHandler, недоступен для загрузчика классов плагина, который содержит Application.e4xmi.

person Kay    schedule 20.07.2012
comment
Спасибо за ваш ответ. Проверка папки с плагинами: она содержит правильный плагин. Я разархивировал файл jar, и класс находится внутри. Файл Application.e4xmi находится внутри подключаемого модуля, содержащего код обработчика. - person Yves_T; 20.07.2012
comment
Опять же, никакого решения, просто догадываюсь, что проверить дальше. Действительно озадачивает. Когда вы используете eclipse IDE для разработки RCP, она включает исходный код. Таким образом, вы можете открыть класс BundleLoader (Навигация по меню, Открыть тип, ...), установить точку останова в методе findClassInternal, возможно, условную точку останова для name.equals("be.....ExitHandler") и попытаться выяснить, почему он терпит неудачу. Например, BundleLoader.bundle, вероятно, должен указывать на пакет, содержащий ExitHandler. Может быть, в отладчике вы получите подсказку, почему он не находит класс: Ищете не тот пакет? - person Kay; 21.07.2012
comment
Суть, конечно, в том, что для этого вам придется прикрепить отладчик IDE к экспортируемому продукту, потому что внутри IDE все работает нормально. - person Kay; 21.07.2012
comment
Вот что я сделал: я создал новую рабочую область и скопировал код Java в новую рабочую область (пересоздал плагины). Затем с новым рабочим пространством я создал новую сборку. Сборка работает нормально. Я собираюсь попытаться выяснить, что пошло не так в исходной рабочей области. - person Yves_T; 22.07.2012

Иногда вам нужно запустить приложение с «-clean» или определить «osgi.clean=true», чтобы убедиться, что вы очистили кешированные зависимости. Запуск в чистой рабочей области будет иметь тот же эффект (без кэшированных значений):

«любые кешированные данные, используемые платформой OSGi и средой выполнения eclipse, будут очищены. Это очистит кеши, используемые для хранения разрешений зависимостей пакетов и данных реестра расширений eclipse. Использование этой опции заставит eclipse повторно инициализировать эти кеши».

Дополнительная информация здесь.

person p2r    schedule 20.08.2012