Простое приложение OSGi с зависимостями внутри пакета

Простое приложение OSGi с зависимостями внутри пакета.

Я играю с карафом. Я начал с написания простого приложения для отдыха. https://github.com/YaroslavTir/osgi-jersey-hibertate/tree/stackoverflow/examples/karaf-rest-core

Я взял примеры karaf в качестве основы, и было довольно просто запустить мой первый пакет с конечными точками отдыха, но затем я столкнулся с проблемой, когда добавил зависимость от maven. Я добавил гуаву в качестве примера и получил исключение при установке бандла в караф

 <dependencies>
       ...
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Export-Package>org.apache.karaf.core.rest.blueprint</Export-Package>
                        <Import-Package>
                            *
                        </Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>


> git clone https://github.com/YaroslavTir/osgi-jersey-hibertate
> mvn clean install 
> feature:repo-add mvn:org.apache.karaf.examples/karaf-rest-core-features/LATEST/xml
> feature:install karaf-rest-core-blueprint

Ошибка при выполнении команды: невозможно разрешить root: отсутствует требование [root] osgi.identity; osgi.identity = karaf-rest-core-blueprint; type = karaf.feature; версия = [4.3.1.SNAPSHOT, 4.3.1.SNAPSHOT]; filter: = (& (osgi.identity = karaf-rest-core-blueprint) (type = karaf.feature) (версия ›= 4.3.1.SNAPSHOT) (version‹ = 4.3.1.SNAPSHOT)) [вызвано: Невозможно разрешить karaf-rest-core-blueprint / 4.3.1.SNAPSHOT: отсутствует требование [karaf-rest-core-blueprint / 4.3.1.SNAPSHOT] osgi.identity; osgi.identity = org.apache.karaf.examples.karaf-rest-core-blueprint; type = osgi.bundle; версия = [4.3.1.SNAPSHOT, 4.3.1.SNAPSHOT]; разрешение: = обязательное [вызвано: Невозможно разрешить org.apache.karaf.examples.karaf-rest-core-blueprint / 4.3.1.SNAPSHOT: отсутствует требование [org.apache.karaf.examples.karaf-rest-core- blueprint / 4.3.1.SNAPSHOT] osgi.wiring.package; filter: = (& (osgi.wiring.package = com.google.common.collect) (версия ›= 29.0.0) (! (версия› = 30.0.0)))]]

Я где-то читал, что org.apache.felix.maven-bundle-plugin имеет ошибку и добавляет дополнительную зависимость к пакету, и это похоже на правду, как я могу видеть в MANIFEST.MF / Import-Package зависимость вроде com.google.appengine.api, которой там быть не должно. :

   <dependencies>
       ...
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Export-Package>org.apache.karaf.core.rest.blueprint</Export-Package>
                        <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                        <Embed-Directory>target/dependency</Embed-Directory>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Я знаю, что это должно быть очень просто, и я просто упускаю небольшую, но важную деталь.


person yaroslavTir    schedule 25.01.2021    source источник


Ответы (1)


Ваша ошибка означает, что ваш пакет karaf-rest-core-blueprint имеет зависимость от com.google.common.collect, и эта зависимость не может быть разрешена в контейнере.

Другими словами, вы не установили гуаву в Караф.

$ bundle:install -s mvn:com.google.guava/failureaccess/1.0.1
$ bundle:install -s mvn:com.google.guava/guava-29.0-jre

В реальном приложении вы должны создать функцию, которая устанавливает все ваши зависимости / пакеты.

person Jérémie B    schedule 30.01.2021
comment
Жереми Б., спасибо за ответ. Так я правильно понимаю, что ВСЕ зависимости должны устанавливаться через бандлы? Что, если я хочу использовать библиотеку, у которой нет пакета? - person yaroslavTir; 31.01.2021
comment
У вас есть три варианта: сделать PR в библиотеку, чтобы добавить метаданные osgi (с bnd теперь это легко); используйте проект сообщества, который предоставляет пакеты osgi для большей части библиотеки OSS (например, servicemix-bundles), или используйте обработчик URL переноса, который динамически добавляет метаданные osgi в любую банку - person Jérémie B; 31.01.2021
comment
Jérémie B, спасибо за ваш ответ, похоже, я изначально неправильно понял, как управлять зависимостями. - person yaroslavTir; 01.02.2021