OSGi Felix и BndTools - Загрузить класс по имени - PullRequest
3 голосов
/ 06 марта 2012

В моей среде OSGi я пытаюсь предварительно загрузить драйвер базы данных для дальнейшего использования.Обычно это можно сделать так:

Class.forName("com.mysql.jdbc.Driver");

После этого можно создать соединение.Однако, если я использую это в OSGi под Феликсом, он говорит, что класс не может быть найден (ClassNotFoundException), и соединение не может быть создано.Но когда я делаю что-то подобное (try-catch опущено):

com.mysql.jdbc.Driver d = new com.mysql.jdbcDriver
Class.forName("com.mysql.jdbc.Driver");

Тогда все работает нормально и соединение создается.Однако это не очень красиво, потому что класс драйвера не может быть заменен.

Есть ли способ загрузить класс первым методом?Я предполагаю, что я должен предоставить правильный загрузчик классов.Но откуда мне это взять?

Драйвер MySQL предоставляется в виде пакета оболочки OSGi.

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

Как именно вы создаете свой манифест пакета? Если вы используете инструменты для автоматического разрешения операторов импорта OSGi вашего пакета, они потерпят неудачу при первом методе, так как они не распознают простую строку как зависимость пакета. Второй метод выражает зависимость как жесткую зависимость Java, поэтому он распознается инструментом, который добавляет требуемый оператор импорта OSGi (и, следовательно, средой выполнения OSGi в путь к классам вашего пакета).

Итак, чтобы ваш первый метод работал, вы должны добавить зависимость к пакету com.mysql.jdbc в операторы импорта OSGi вашего пакета. Как это достигается, зависит от конкретного инструмента, Bnd использует параметр конфигурации Import-Statement .

3 голосов
/ 06 марта 2012

Все, что сказал Хери в своем ответе, было правильным.Однако, если вы хотите повысить гибкость этой системы, используйте OSGi Services .

. Вы хотите установить соединение с базой данных, но не хотите тесно связывать свой код с конкретной базой данных.или драйвер JDBC.Почему бы не написать небольшой пакет-обертку JDBC, который публикует сервис javax.sql.DataSource?Затем ваш логический пакет может связываться со службой, когда он хочет запросить базу данных, и ему не нужно ничего знать о физическом соединении с базой данных.

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

...