Подготовьте зависимость OSGi от maven

Я пытаюсь подключить базу данных в проекте 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 .упаковка; (osgi.wiring.package=com.mysql.jdbc)

Я пробовал все доступные решения от SO, но они не решили проблему. Пока я пытался найти причину ошибки, я увидел предупреждение в объявлении зависимостей mysql в IDE, в котором говорится:

Maven Dependency не поддерживает OSGi

Итак, я думаю, основная причина в том, что моя зависимость не готова для контейнера OSGi. Может ли кто-нибудь помочь мне, как сделать OSGi зависимой от maven готовой?

Ниже приведен мой код 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>

Edit: I followed Christain suggestion and it work great. But I need to add other dependencies which are not OSGi ready.

Я выполнил установку зависимостей, отличных от OSGi, на сервер FUSE. А также обертывание зависимостей, но не решило проблему.

Пожалуйста, помогите мне с решением деталей, я действительно застрял здесь.


person Crawler    schedule 04.12.2015    source источник
comment
Особая причина использования такой древней версии maven-bundle-plugin?   -  person khmarbaise    schedule 04.12.2015
comment
Вы смотрели на упаковку зависимости? stackoverflow .com/questions/4565327/   -  person stalet    schedule 04.12.2015


Ответы (4)


Через несколько дней поисков я наконец нашел самые простые решения. Пакет без OSGi можно сделать готовым к OSGi, просто используя эту простую команду osgi wrap в терминале Karaf или ServiceMix:

osgi:install wrap:mvn:org.jdbi/jdbi/2.70

Зависимость будет установлена ​​на сервере Fuse, что можно проверить с помощью команды.

osgi:список

Теперь просто добавьте зависимости в pom.

<dependency>
    <groupId>org.jdbi</groupId>
    <artifactId>jdbi</artifactId>
    <version>2.70</version>
</dependency>

Идея по-прежнему будет предупреждать вас, что зависимость не готова к OSGi, просто игнорируйте ее.

Наконец, импортируйте необходимый пакет в плагин пакета maven, и все готово.

<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>

Надеюсь, это поможет кому-то в будущем.

person Crawler    schedule 16.12.2015

В случае драйвера mysql вам не нужно делать упаковку самостоятельно. Соединитель mysql j, доступный в maven Central, уже готов к работе с OSGi. Координаты maven: mvn:mysql/mysql-connector-java/5.1.34.

Поскольку использовать простой драйвер jdbc в OSGi непросто, я рекомендую вам также использовать pax-jdbc. Это позволяет создать DataSource как службу OSGi, просто предоставив некоторую конфигурацию.

Вы можете установить его следующим образом (в Karaf > 3):

Это уже предоставляет DataSourceFactory для MySQL и включает поддержку конфигурации и пула.

Затем вам просто нужно создать конфигурацию, как описано в документы pax jdbc.

person Christian Schneider    schedule 04.12.2015
comment
+1 за ваше предложение jdbc, готовое к OSGi. Я следил за вашим блогом, и он отлично работает. Но мне также нужно добавить другие зависимости, которые не готовы к OSGi, такие как org.jdbi. Можете ли вы предложить мне jdbi, который уже готов к OSGi, или метод, чтобы сделать OSGi не готовыми к OSGi зависимостям. - person Crawler; 07.12.2015

Эта ошибка означает, что Fuse не знает о пакете для драйвера mysql. Вам нужно установить его вручную. Поскольку коннектор mysql представлен в виде пакета, его проще установить в среде OSGI. Просто используйте osgi:install, а затем имя пакета.

Вы также можете создать архив Kar, чтобы избежать этого.

В качестве альтернативы используйте собственный драйвер sql Karaf/Fuse, как упоминал Кристиан.

person Souciance Eqdam Rashti    schedule 04.12.2015
comment
Я исправил проблему с jdbc, но теперь мне нужно работать с jdbi. jdbi показан активным в списке пакетов OSGi консоли karaf. но проблема не решена. - person Crawler; 07.12.2015

Для зависимостей Maven, которые не готовы к OSGi, существует плагин maven для их деформации — https://github.com/reficio/p2-maven-plugin, учебник — http://www.vogella.com/tutorials/EclipseTycho/article.html#d314078e1011. Этот подход хорошо работает для простых компонентов, но для компонентов с большим количеством зависимостей или большого количества экспортированных пакетов вам может потребоваться вручную создать пакет-оболочку, например. Мне пришлось вручную создавать пакеты-оболочки для pegdown, selenium и selendroid.

person Pavel Vlasov    schedule 06.12.2015
comment
Я должен использовать org.jdbi. Пакет org.skife.jdbi.* выдает исключение проводки, а вышеприведенному пакету требуется пакет org.antlr.stringtemplate. теперь не могли бы вы уточнить, как создать оболочку для этого условия. Я пытался создать оболочку, но она не работает. - person Crawler; 07.12.2015
comment
Это процесс, которому я следую при переносе компонентов maven в OSGi: - person Pavel Vlasov; 15.12.2015
comment
a) Посмотрите на дерево зависимостей, а затем просмотрите репозитории Eclipse и Orbit, чтобы увидеть, есть ли уже обернутые зависимости (например, org.json, javax.transaction, junit,...) b) Если количество зависимостей невелико и они недоступны в репозиториях Eclipse и Orbit — попробуйте использовать p2-maven-plugin. В некоторых случаях это плохо работает. c) Если есть существующие обернутые зависимости или p2-maven-plugin не работает должным образом (например, в случае Selenium WebDriver) — создайте проект плагина в Eclipse со всеми развернутыми jar-файлами зависимостей, добавьте обернутые зависимости и создайте репо с Tycho. /Мейвен - person Pavel Vlasov; 15.12.2015
comment
В качестве примера вы можете использовать мой сторонний репозиторий: www.nasdanika.org/ Third-Party.zip - person Pavel Vlasov; 15.12.2015