Использование Guice с OSGi - PullRequest
2 голосов
/ 30 октября 2009

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

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

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

Ответы [ 4 ]

4 голосов
/ 01 ноября 2009

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

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

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

4 голосов
/ 12 ноября 2009

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

1 голос
/ 01 ноября 2009

Я предполагаю, что ваши комментарии на package-private связаны с этой страницей на Guice и bridging class loaders ?

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

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

0 голосов
/ 16 ноября 2009

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

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

...