com.mysql.jdbc.Driver не найден пакетом в karaf

У меня есть пакет, который использует mySQL.jdbc.driver, я указал зависимость в файле pom, импорт-пакеты и скопировал соединитель mysql в lib, папку развертывания, установил драйвер mysql, используя install wrap:mvn:mysql/mysql-connector- java/5.1.17, я имею в виду, что я сделал все возможное, как я, но все же я получаю сообщение об ошибке, как указано ниже, к вашему сведению, я использую karaf-4.0.0.M2, пожалуйста, помогите мне с его дорожным препятствием,

errorMessage = JDBC driver name is missing or not valid, cause = java.lang.ClassNotFoundException: com.mysql.jdbc.Driver not found by portframeworkservice [this is my bundle name]

Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver not found by portframeworkservice [145]
    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:356)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)

person Sachin Singh    schedule 23.06.2015    source источник
comment
Можете ли вы опубликовать фрагмент кода, который вы используете для инициализации драйвера mysql?   -  person Christian Schneider    schedule 23.06.2015


Ответы (1)


Драйверы базы данных в OSGi всегда немного сложны, поскольку наиболее распространенный подход вне OSGi с использованием DriverManager не совсем подходит для OSGi.

Лучшим подходом в OSGi является использование DataSourceFactory, стандартизированного альянсом OSGi. Некоторые драйверы баз данных уже предлагают это. Для других pax-jdbc предоставляет адаптер. Для mysql применим второй случай.

Поэтому я советую использовать pax-jdbc следующим образом:

feature:repo-add pax-jdbc 0.6.0
feature:install pax-jdbc-mysql

Если вы затем сделаете

karaf@root()> service:list DataSourceFactory
[org.osgi.service.jdbc.DataSourceFactory]
-----------------------------------------
 osgi.jdbc.driver.class = com.mysql.jdbc.Driver
 osgi.jdbc.driver.name = mysql
 service.bundleid = 52
 service.id = 110
 service.scope = singleton

Таким образом, эта функция предлагает вам готовую к использованию DataSourceFactory. Вы можете связать его как службу OSGi и создать из него DataSource. Чтобы сделать его еще более удобным, вы также можете использовать pax-jdbc-config и pax-jdbc-pool для создания готового к использованию объединенного источника данных в качестве службы.

У меня есть полное руководство по доступу к базам данных в OSGi, в котором показан этот подход.

person Christian Schneider    schedule 23.06.2015
comment
К сожалению, похоже, что эти функции не поддерживаются, например, проект pax-jdbc-myql использует драйвер mysql, последний раз обновленный 3 года назад github.com/ops4j/org.ops4j.pax.jdbc/commit/ . - person Adrian Baker; 21.02.2018
comment
pax-jdbc поддерживает большое количество баз данных. Люди обычно обновляют драйвер, когда им нужна новая версия для их собственного проекта. Если вы создадите PR для новой версии mysql, я могу помочь вам включить его в код. - person Christian Schneider; 21.02.2018
comment
@ChristianSchneider: я создал источник данных в соответствии с вашим описанием и поместил ‹ссылку/› на этот DS в blueprint.xml моего проекта верблюда. Однако при запуске Karaf схема не инициализируется, поскольку DS недоступна во время инициализации схемы. Если я подожду, пока запустится Karaf, я смогу развернуть проект без проблем, но когда я пытаюсь автоматически загрузить свой пакет во время запуска, он всегда терпит неудачу с указанным исключением. Вы знаете, как решить эту проблему? - person Kim Zeevaarders; 21.05.2019
comment
Совершенно нормально, что DataSource может отсутствовать при запуске контекста схемы. Blueprint должен дождаться появления DataSource, а затем продолжить запуск вашего blueprint. Можете ли вы показать свой проект на github? - person Christian Schneider; 21.05.2019