Отражение с пакетами 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?