2013-03-25 5 views
2

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

Jlove

ответ

0

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

Способ, который работает в OSGi, заключается в том, чтобы вместо этого использовать DataSource: http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html. Там вы просто создаете источник данных, используя новые, и это, конечно, работает. Проблема в том, что он заставляет ваш набор пользователей зависеть от конкретного драйвера DB. Поэтому наилучшей практикой является создание центра данных DataSource и публикация его как службы.

Более подробную информацию вы найдете в моем учебном пособии по Apache Karaf DB (http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access).

КПП. В общем, такие заводы находятся там, где библиотеки не работают в OSGi. Каждый lib изобретает другую и другую заводскую систему, и большинство из них несовместимы с ограниченными загрузчиками классов OSGi. К счастью, большинство libs теперь готово OSGi. В большинстве случаев это просто означает, что вы также можете вызвать завод с конкретным объектом, который вы можете получить, используя службу OSGi.

+0

Спасибо за информацию ... Я нашел ее очень полезной – JLove

0

Мой предпочтительный подход не завернуть в библиотеку, но unjar его, добавить манифест, и повторно баночке. Jars-inside-jars имеют тенденцию вызывать проблемы, которые трудно отлаживать. Unjar и re-jar могут быть автоматизированы с помощью простого скрипта ant.

Кроме того, мне нравится писать MANIFEST.MF вручную. Если обернутая библиотека невелика, то это достаточно легко сделать. Такие инструменты, как bnd, которые генерируют MANIFEST.MF для вас, не всегда дают правильные результаты, и если вы слишком полагаетесь на них, вы не знаете, что происходит под капотом.

+0

Спасибо за отзыв, можете ли вы сказать мне, работает ли это решение в соответствии с моим примером выше с драйвером Oracle? Я использую мастер eclipse для обертывания существующего файла jar, который извлекает банку как часть процесса, поэтому я не уверен, что это закончится другим результатом. – JLove

+0

Не уверен, я использовал библиотеку Oracle в контексте OSGi раньше, без особых проблем. Вы хотите опубликовать MANIFEST.MF, который генерирует eclipse? – amarillion

+0

Будет ... Завтра будет завтра. Спасибо – JLove

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