Вопрос

У меня есть проект, который я пытаюсь преобразовать в OSGi. Однако этот проект был построен с Guice в качестве менеджера внедрения зависимостей. Это большой проект с Guice, переплетенным повсюду. Guice дает мне много подходов с процессом преобразования. В частности, мне дали NoClassDefFoundError для com.google.inject.internal.cglib.reflect.FastClass. Я позаботился о том, чтобы ничего не было закрыто для пакета, и я также скачал и использовал guice-2.0-customloader.jar. Тем не менее, безрезультатно.

Есть ли какой-нибудь совет от любого, кто пошел по этому пути? Стоит отметить, что я использую peaberry для получения динамических сервисов из среды OSGi (для архитектуры типа плагина), которую затем использую в программе.

Большое спасибо, Стив

Это было полезно?

Решение

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

Если guice действительно является ядром вашего приложения, возможно, имеет смысл сделать его фрагментом пакета System Bundle. Системный пакет является корневым узлом в дереве загрузчика классов для ВСЕХ пакетов. Если в этом комплекте есть классы, они будут доступны везде. Эту технику я успешно использовал для упаковки Swing LAF (Substance, Alloy, Jide) в пакеты OSGi. Они должны быть на корневом уровне, так как все мои пакеты используют Swing (особенно загрузчик классов Swing)

Вы захотите проверить спецификации OSGi для создания пакета Fragment и создания этого фрагмента для фрагмента расширения платформы. Я смог сделать это только с помощью Eclipse Equinox. В то время, когда я писал большинство вспомогательных классов, Apache Felix еще не поддерживал фрагменты расширения платформы. Это могло измениться сейчас. Я понятия не имею о каркасах (knopplefish, spring-dm)

Другие советы

Просто используйте Peaberry . Он имеет всю необходимую поддержку для использования Guice в OSGi. Не нужно изобретать все заново!

Я предполагаю, что ваши комментарии на уровне пакета связаны с этой страницей в Загрузчики классов Guice and bridging ?

Есть сообщение об ошибке / исправление, которое может быть связано с вашей проблемой: http://code.google.com/p/google-guice/issues/detail?id=343

Вы пытались добавить Guice и cglib в стандартный путь к классам и выполнить для них загрузочное делегирование? Это подтвердит / опровергнет вашу проблему, как указано в приведенном выше отчете об ошибке.

Вы можете попробовать мой последний патч для выпуска 343 - только что прикрепил недавно исправленную сборку, которая является самой последней транк Guice плюс этот один патч, так что люди могут попробовать его и дать отзыв.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top