2009-10-30 5 views
2

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

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

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

+0

, с какой OSGi вы используете? – basszero

ответ

4

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

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

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

1

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

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

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

4

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

0

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

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

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