Сделайте 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.

Другие вопросы по тегам