2017-01-16 28 views
0

Я знаю, что это обычная проблема, но создание нового потока на всякий случай, если кто-то застрял, как я, даже после того, как попробовал некоторые из параметров, уже описанных в документах.OSGi ClassNotFoundException при загрузке драйвера базы данных

Я развернул пакет osgi (Say Bundle B), у которого есть весь код, связанный с доступом к уровню данных. В основном, когда доступ к сервису из этого пакета, он создает соединение JDBC только в первый раз, загружая драйвер. Драйвер развернут как еще один завернутый пакет sqljdbc 4.0. (Скажите Bundle C)

Теперь у меня есть Bundle TestApp (Say Bundle A), который создает экземпляр вышеупомянутого метода обслуживания из Bundle B. Итак, поток здесь - Bundle. Код создает экземпляр экспортированной службы Bundle B, которая в перейдите в класс Bundle C's Driver.

Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver not found by DataServices [417] 
     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556) 
     at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77) 
     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:264) 

Отдельный загрузчик классов делает здесь пробку, но как преодолеть ситуацию здесь для меня. Я попробовал добавить DynamicImport-Package к пакетам A, B, попробовал создать пакет фрагментов, как здесь, здесь https://gist.github.com/rotty3000/1291842, но все же такое же исключение. Продолжает.

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

Спасибо заранее и с новым годом.

+0

Какой код у вас есть в вашем комплекте (только показать соответствующие строки). Что он делает в том месте, где происходит исключение? –

+0

Из Bundle A, PremiumService service = новый PremiumServiceImpl(); Из Bundle B PremiumServiceImpl dao.getJdbcConnection(), который в свою очередь вызывает Class.forName(), From Bundle C, sqljdbc4-4.jar, который является завернутым пакетом –

+0

Когда я отлаживал приложение в этой строке Class.forName (driverClassName) , загрузчик классов был загрузочным загрузчиком класса с пакетом в виде имени связки A и, хотя эта строка кода находится в проекте Bundle B (DataServices). Значение имени класса драйвера также подтверждается как правильное. –

ответ

1

Подход драйвера в OSGi не работает. Вместо этого используйте DataSource. См. example at msdn. Вы можете просто создать источник данных, используя новый. Это позволяет избежать проблем с загрузкой классов.

Если вы хотите отделить от фактического поставщика БД, то вы можете использовать спецификацию OSGi jdbc, которая определяет, что провайдеры db должны выставлять DataSourceFactory, который может создать DataSource для вас.

Pax-jdbc поддерживает эту спецификацию для широкого спектра поставщиков услуг db. Он позволяет иметь модуль pax-jdbc-config, который позволяет создавать DataSource в качестве службы OSGi, используя только конфигурацию. Таким образом, в вашем коде вы можете просто ввести услугу и сделать это. Кроме того, pax-jdbc-config также может заботиться об объединении и информировании DataSource XA. Таким образом, он создает полностью готовый DataSource.

+0

Спасибо, Кристиан, позвольте мне попробовать этот вариант. –

+0

Pax-jdbc, я вижу широкий диапазон поддержки БД, но не вижу SQLServer. Это где мы должны пойти с Generic Driver Extender? –

+0

Существует модуль mssql. https://github.com/ops4j/org.ops4j.pax.jdbc/tree/master/pax-jdbc-mssql. Это часть релизов с 0.6.0 –

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

  • Нет связанных вопросов^_^