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>