OSGi и переходные зависимости

Я использую Felix Framework для своего проекта OSGi, но я столкнулся с серьезной проблемой, касающейся сторонних зависимостей.

Я использую eclipse и maven-bundle-plugin для генерации моих пакетов из исходных кодов и файла MANIFEST.MF из файла POM.XML. Все идет нормально. однако, когда у меня есть сторонние зависимости в моем пакете, я обнаруживаю, что ищу бесконечный список JAR-файлов, которые обычно не являются пакетами, и помещаю их в мой каталог Felix /bundle до тех пор, пока не исчезнут никакие зависимости.

Я называю этот процесс "Загрузка Интернета для работы моего приложения OSGi".

Что я делаю неправильно? Конечно, я, должно быть, делаю что-то очень неправильное, потому что я не могу представить, чтобы у кого-то был пакет A, который зависит от B, который затем зависит от C и D, а затем эти два будут зависеть от нескольких других и так далее… чтобы искать ВСЕ эти зависимости вручную, используя Google или Maven Central! Это безумие!

Как правильно это автоматизировать? Я хотел бы иметь одно из двух решений:

1) Уметь создавать массивный JAR-файл со всеми его зависимостями, но экспортировать только те пакеты, которые мне нужны, и, разумеется, не импортировать ни один пакет.

2) (Мое предпочтительное решение) Наличие способа поместить все мои зависимости в отдельные файлы JAR, которые я могу просто вставить в каталог /bundle.

3) (Еще более предпочтительно) Возможность использовать сторонние JAR-файлы без загрузки 8 ГБ зависимостей в мой проект.

Я нашел инструменты, которые делают это, но только для прямых (1-й степени) зависимостей, оставляя транзитивные зависимости для решения вручную.

Эта проблема является критической. Отсутствие такого инструмента затрудняет использование OSGi. Я искал, искал и искал, я встретил все 101 решение, такое как PAX, bndtools и друзья, но кажется, что они не решают эту проблему...

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

Спасибо!

-

-

Редактировать: я прилагаю пример проекта, в котором я пытаюсь использовать JScience, но получающийся в результате JAR-пакет продолжает спрашивать меня о новых Imports, то есть он не является автономным.

Ссылка на пример: https://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0

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

Я не смог найти никакой документации, касающейся тега Conditional_Package для maven-bundle-plugin. Однако связанные поиски показывают мне встроенный вариант, который я пробовал раньше, но безуспешно.

Я создал базовый проект, в котором у меня есть один класс, использующий библиотеку JScience, и в его POM.XML у меня есть следующее:

<plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId};singleton:=true
                        </Bundle-SymbolicName>
                        <Bundle-Version>${project.version}</Bundle-Version>
                        <Export-Package>shared.properties.api, shared.properties.base
                        </Export-Package>
                        <Embed-Dependency>!org.osgi.*;scope=compile|runtime;inline=true</Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
            </plugin>
</plugins>

Я говорю Maven, чтобы встроить все пакеты, которые не из самой рамки OSGI. И, глядя на получившийся JAR-файл, он выглядит довольно хорошо, теперь я включил только пакеты вместо целых JAR-файлов (однако мне кажется, что мне не нужны все эти встроенные пакеты, поскольку я использую только два из них). Более того, если я открою файл MANIFEST.MF, я увижу эту проблемную строку:

Manifest-Version: 1.0
Bnd-LastModified: 1414164534170
Build-Jdk: 1.6.0_65
Built-By: Pedro
Bundle-ManifestVersion: 2
Bundle-Name: RequireJscienceExample
Bundle-SymbolicName: RequireJscienceExample;singleton:=true
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: !org.osgi.*;scope=compile|runtime;inline=true
Embed-Transitive: true
Import-Package: org.joda.convert,org.xml.sax <------ Problem...
Tool: Bnd-1.50.0

говоря, что мне не хватает org.joda.convert и org.xml.sax.

Что меня удивляет, так это то, что мы говорим о библиотеке (JScience), которая утверждает, что она совместима с OSGi: http://jscience.org/

Что мне не хватает? Я действительно не могу позволить себе не использовать JScience. И раньше я отказывался от нескольких сторонних библиотек, что сэкономило бы мне время на разработку из-за трудностей интеграции сторонних OSGi.

1 ответ

Почему бы просто не позволить Maven разрешить транзитивные зависимости и загрузить их для вас.

Как только вы добавите их в pom.xml, IDE, например, Eclipse (на самом деле плагин m2e), сможет разрешать, загружать и показывать полученные файлы. (Ты можешь использовать mvn dependency:tree а из командной строки)
Затем просмотрите и exclude нежелательные, например, необязательные или с пакетами, уже экспортированными другим пакетом.
И да, использовать provided сфера, например, для org.osgi.*

<Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
Другие вопросы по тегам