Сделайте maven зависимостью OSGi готовой
Я пытаюсь подключить базу данных в проекте JFUSE. Я включил зависимость com.mysql.jdbc в pom-файл, и сборка проекта работает нормально. Но потом я сталкиваюсь с этой досадной проблемой. Когда я пытаюсь установить пакет в OSGi, установка не удалась со следующей ошибкой:
Невозможно запустить пакет mvn:com.info.demo/demo-rest/1.0: Неразрешенная постоянная ошибка в пакете com.info.demo.rest [363]: Невозможно разрешить 363.0: отсутствует требование [363.0] osgi.wiring.package; (osgi.wiring.package = com.mysql.jdbc)
Я перепробовал все доступные решения от SO, но они не решили проблему. Пока я пытался найти причину ошибки, я увидел предупреждение в объявлении зависимостей mysql в IDE, которое говорит:
Maven Dependency не готова для OSGi
Итак, я думаю, главная причина в том, что моя зависимость не готова к контейнеру OSGi. Может ли кто-нибудь помочь мне, как сделать Maven зависимость OSGi готова?
Ниже мой код pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
***Project specific declarations here***
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.1.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Fragment-Host>org.springframework.jdbc</Fragment-Host>
<Import-Package>com.mysql.jdbc</Import-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.mysql.jdbc</groupId>
<artifactId>com.springsource.com.mysql.jdbc</artifactId>
<version>5.1.6</version>
</dependency>
***Other Dependencies***
</dependencies>
Редактировать: я последовал предложению Кристен, и это прекрасно работает. Но мне нужно добавить другие зависимости, которые не готовы OSGi.
Я прошел установку не OSGi-зависимостей на сервер FUSE. А также обертывание зависимостей, но не решило проблему.
Пожалуйста, помогите мне с деталями решения, я действительно застрял здесь.
4 ответа
После нескольких дней поиска я наконец нашел самые простые решения. Пакет не OSGi можно сделать OSGi готовым с помощью этой простой команды osgi wrap в терминале Karaf или ServiceMix:
osgi: установить обертку:mvn:org.jdbi/jdbi/2.70
Зависимость будет установлена на сервере Fuse, что можно проверить с помощью команды.
OSGi: список
Теперь просто добавьте зависимости в pom.
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi</artifactId>
<version>2.70</version>
</dependency>
Идея все равно предупредит вас, что зависимость не готова к OSGi, просто игнорируйте ее.
Наконец, импортируйте нужный пакет в плагин Maven Bundle, и все готово.
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>${version.maven-bundle-plugin}</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Import-Package>
org.skife.jdbi.v2,
org.skife.jdbi.v2.util,
org.skife.jdbi.cglib.proxy,
org.skife.jdbi.v2.sqlobject.stringtemplate,
org.skife.jdbi.v2.sqlobject,
org.skife.jdbi.cglib.core
</Import-Package>
</instructions>
</configuration>
</plugin>
Надеюсь, это поможет кому-то в будущем.
В случае с драйвером mysql вам не нужно делать перенос самостоятельно. MySQL-коннектор j, доступный в maven central, уже готов для OSGi. Координаты maven: mvn:mysql/mysql-connector-java/5.1.34.
Так как использовать простой драйвер jdbc в OSGi нелегко, я рекомендую также использовать pax-jdbc. Это позволяет создать источник данных как сервис OSGi, просто предоставив некоторые настройки.
Вы можете установить его следующим образом (В Karaf > 3): функция:repo-add pax-jdbc 0.7.0 функция: установить транзакцию pax-jdbc-mysql pax-jdbc-config pax-jdbc-pool-dbcp2
Это уже предоставляет DataSourceFactory для MySQL и включает поддержку конфигурации и пула.
Тогда вам просто нужно создать конфигурацию, как описано в документации по pax jdbc.
Эта ошибка означает, что Fuse не знает о пакете для драйвера mysql. Вам нужно вручную установить его. Поскольку соединитель mysql находится в форме пакета, его легче установить в среде OSGI. Просто используйте osgi:install, а затем имя пакета.
Вы также можете создать архив Kar, чтобы избежать этого.
В качестве альтернативы используйте собственный драйвер sql Karaf/Fuse, как упомянуто Christian.
Для зависимостей Maven, которые еще не готовы к OSGi, существует плагин maven для их деформации - https://github.com/reficio/p2-maven-plugin, учебное пособие - http://www.vogella.com/tutorials/EclipseTycho/article.html. Этот подход хорошо работает для простых компонентов, но для компонентов с большим количеством зависимостей или большим количеством экспортируемых пакетов вам может потребоваться вручную создать пакет обертки, например, мне пришлось вручную создавать пакеты обертки для pegdown, selenium и selendroid.