Мне нужно встроить сторонний JAR-файл в пакет OSGi, который я разрабатываю в Eclipse. Я много искал и читал, и я снова и снова повторяю одно и то же:Встраивание JAR в пакет OSGi в Eclipse
- Я действительно не должен этого делать. Это не «способ» OSGi делать вещи.
- На самом деле это довольно легко сделать. Просто вставьте JAR в корень вашего пакета и укажите в своем манифесте
Bundle-ClassPath: ., jar_filename.jar
.
Хорошо. За исключением JAR, я внедряю крошечную и вряд ли использую что-нибудь еще, что я когда-либо буду реализовывать в этой закрытой системе, поэтому ее проще вставлять, чтобы пользователи загружали только один комплект (простота использования в конце -ser жизненно важно). Поэтому я собираюсь идти против конвенции и вставлять ее.
Теперь, в среде IDE, все кошерное. Я сбросил JAR в папку src
моего проекта Eclipse и настроил путь построения проекта, чтобы включить его, используя кнопку «добавить банку» (а не «добавить внешнюю банку», так как я убежден, что будет использовать абсолютный путь) диалога «configure build path». Я также добавил строку Bundle-ClassPath
в файл манифеста. В IDE все мои импортные решения устраняются (поскольку он находится в пути сборки), но когда я экспортирую его в виде пакета (параметры по умолчанию), журнал ошибок показывает, что импорт не может быть разрешен.
Я проверил файл JAR финального пакета, который был сгенерирован, а сторонний JAR вложен внутри (в корневой каталог), как и ожидалось, но как только он пытается импортировать объекты из этой библиотеки, он терпит неудачу.
Включенный ниже мой (очень простой) MANIFEST.MF
. Я что-то упускаю? Нужно ли мне перечислять его как пакет импорта в дополнение к его перечислению в пути bundle-classpath? Мне нужно экспортировать его (почему?)? Я неправильно использую pathle-classpath? Нужно ли мне делать что-то по-другому, потому что я использую Eclipse?
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ZWave Demo
Bundle-SymbolicName: com.wbarlow.zwavedemo
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.wbarlow.zwavedemo.internal.Activator
Bundle-Vendor: WBARLOW
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .,
rxtx-2.1.7.jar
EDIT: Я решил это повторно делать все это с помощью графического интерфейса, а не редактирования файла .mf непосредственно. Я думаю, что Eclipse устанавливает некоторую конфигурацию фона, когда вы это делаете.
Не чувствуйте себя плохо в отношении внедрения JAR, это совершенно нормально по причинам, которые вы указываете. Вы делаете свой пакет намного проще в использовании, встраивая эти крошечные зависимости от реализации (и скрывая их!).Использование Bundle-ClassPath, к сожалению, не так хорошо, но если вы не используете bnd/Bndtools, трудно просто включить соответствующие классы. –
Eclipse кэширует MANIFEST.MF. Поэтому редактирование в основном не влияет, пока вы не перезапустите Eclipse:/ – Weltraumschaf