2014-09-04 3 views
0

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

Он использует 3 parametered Class.forName с Thread.currentThread(). GetContextClassLoader()

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

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

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

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

Не могли бы вы помочь мне в этом.

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

ответ

2

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

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

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

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

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

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

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

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

1

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

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