Как работать с зависимостями с предоставленной областью действия в OSGi

Существует множество туториалов, в которых показано, как справиться с зависимостями проекта OSGi и как их преобразовать в бандл. После более чем однодневного исследования я так и не нашел, как бороться с зависимостями с областью действия provided.

Позвольте мне привести пример. В настоящее время я использую Dropbox (dropbox-core-sdk 3.0), и у него есть две зависимости (com.google.android и javax.servlet) с областью действия provided. Когда я использую такие методы, как maven-bundle-plugin или bnd, загружаются только артефакты и их транзитивные зависимости. Однако мне также нужны предоставленные зависимости, чтобы иметь возможность импортировать мой проект в контейнер OSGi.

Я использую maven-bundle-plugin, и мой pom.xml выглядит так:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.artifactId};singleton:=true</Bundle-SymbolicName>
                    <Bundle-Version>${project.version}</Bundle-Version>
                    <Export-Package>*</Export-Package>
                    <Embed-Transitive>true</Embed-Transitive>
                    <Embed-Dependency>*</Embed-Dependency>
                </instructions>
            </configuration>
        </plugin>
    </plugins>
</build>

даже если Embed-Dependency говорит включить все, в банке находятся только зависимости + транзитивные зависимости. Тем не менее, я хочу, чтобы банки с предоставленной областью также находились в банке.

Есть ли способ загрузить зависимости с областью действия provided. Если нет, то как поступить в этой ситуации?


person Ad Infinitum    schedule 28.03.2017    source источник


Ответы (2)


Мне пришлось бы положиться на экспертов Maven BND, но я не думаю, что вы можете включать предоставленные зависимости через сборку Maven. Поскольку маловероятно, что вы будете использовать компоненты Android вне своего пакета, не могли бы вы просто вручную загрузить необходимые файлы JAR и поместить их в свой пакет (Bundle-Classpath)?

person David Woodard    schedule 28.03.2017
comment
Спасибо, Дэвид, за ваш ответ. Я выбрал очень плохой API, такой как Dropbox, чтобы начать с osgi, потому что это огромная библиотека и зависимость от всего. Практически невозможно разобраться со всеми этими зависимостями вручную. Вот почему я хотел автоматизировать процесс. - person Ad Infinitum; 29.03.2017
comment
Я загрузил необходимые банки вручную и поместил их в свой пакет, но у Android также есть тысячи зависимостей (переходные + предоставленные). Я на самом деле застрял и не знаю, как идти дальше. - person Ad Infinitum; 29.03.2017
comment
Я понимаю, возможно, эксперты Maven BND могут опубликовать решение. В качестве другого подхода вы можете запустить проект Dropbox как отдельный процесс Java и взаимодействовать с Kura через MQTT или REST. Я видел, как этот подход используется для приложений, которые просто не вписываются в архитектуру OSGi. - person David Woodard; 29.03.2017

Я думаю, вы можете указать области зависимостей, которые хотите встроить. Однако будьте осторожны: некоторые зависимости, такие как jar-файлы спецификаций OSGi, никогда не следует развертывать.

Как правило, вы можете встраивать только те зависимости, которые скрыты внутри пакета. Любые пакеты, необходимые для взаимодействия с другими пакетами, лучше не развертывать.

Например, API-интерфейс сервлета обычно предоставляется используемым вами пакетом httpservice.

Попробуйте этот вариант:

<Embed-Dependency>*;scope=compile|provided</Embed-Dependency>

person Christian Schneider    schedule 28.03.2017
comment
Спасибо, Кристиан, я отредактировал свой ответ. В конфигурации Maven я уже говорил, что нужно включать все зависимости. - person Ad Infinitum; 28.03.2017