Отражение с пакетами OSGI, для зависимых фляг

Я написал фреймворк (назовем A), и он зависит от драйверов и источника данных jdbc и загружает классы, используя отражение.

Он использует 3 параметризованных Class.Forname с Thread.currentThread(). GetContextClassLoader()

Теперь я хочу использовать этот фреймворк A.jar внутри пакета OSGI. Я сгенерировал файл манифеста для A.jar, правильно добавил импорт и экспорт.

Импорт и экспорт не работали, потому что я загружаю класс с помощью отражения, поэтому я использовал DynamicImport-Package.

Но, это работает, только если я включаю DynamicImport-Package в Bundle, который использует A.jar, Это не работает, если я включаю DynamicImport-Package в A.jar

У меня не может быть каждого пакета, который использует A.jar, чтобы изменить свой файл манифеста и включить DynamicImport.

Можете ли вы помочь мне с этим.

PS: я не могу изменить, чтобы статически загрузить класс. Я упростил проблему, пропустив некоторые детали, например, A.jar на самом деле использует Oracle UCP, который использует отражение для загрузки источника данных.

2 ответа

Решение

Class.forName(...) - это анти-паттерн в OSGi. Никогда-никогда не используйте это! Thread.currentThread(). GetContextClassLoader() - это второй антишаблон в OSGi.

На мой взгляд, DynamicImport-Package также является анти-паттерном. Он доступен только для того, чтобы позволить уже выпущенным технологиям работать в OSGi (я имею в виду: работать столько, сколько они могут, пока не будет доступно дружественное OSGi решение для той же проблемы).

Вам удалось использовать все три из них:).

OSGi основана на услугах. Сервисы основаны на интерфейсах (или иногда классах). Попробуйте подумать о регистрации службы OSGi на одной стороне и использовать службу на другой стороне! Попробуйте определить API, который поможет вам избежать этих шаблонов!

Вы хотите работать с драйверами JDBC. Вам следует прочитать главу 125 "Спецификация сервиса JDBC" в главе " Спецификация OSGi".

Попробуйте поискать "Class.forname OSGi" и "thread.getContextClassLoader OSGi" в Google, и вы увидите много полезных объяснений, почему их не следует использовать.

Один из них: http://wiki.osgi.org/wiki/Avoid_Classloader_Hacks

После прочтения этих статей вы получите более полное представление о том, как разрабатывать решения на основе OSGi.

Почему бы не включить ucp.jar в A.jar и использовать Bundle-ClassPath в A.jar?

Другие вопросы по тегам