2014-11-11 5 views
6

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

  1. Я действительно не должен этого делать. Это не «способ» OSGi делать вещи.
  2. На самом деле это довольно легко сделать. Просто вставьте 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 устанавливает некоторую конфигурацию фона, когда вы это делаете.

+0

Не чувствуйте себя плохо в отношении внедрения JAR, это совершенно нормально по причинам, которые вы указываете. Вы делаете свой пакет намного проще в использовании, встраивая эти крошечные зависимости от реализации (и скрывая их!).Использование Bundle-ClassPath, к сожалению, не так хорошо, но если вы не используете bnd/Bndtools, трудно просто включить соответствующие классы. –

+0

Eclipse кэширует MANIFEST.MF. Поэтому редактирование в основном не влияет, пока вы не перезапустите Eclipse:/ – Weltraumschaf

ответ

4

Вместо того, чтобы положить .JAR в папке Src проекта и непосредственного редактирования файла манифеста, чтобы обратиться к нему, как будто он находится в корневом каталоге (хотя это действительно был в корне пучка, по-видимому, это Didn я работаю), я смог решить эту проблему, используя редактор графических манифеста Eclipse.

  1. Поместите внешний JAR в корень проекта Eclispe.
  2. Откройте файл META-INF/MANIFEST.MF в Eclipse.
  3. На вкладке «Runtime» выберите «Добавить ...» и добавьте внешний JAR.
0

Вам нужно указать «Экспорт-Пакет», чтобы указать, какие пакеты доступны для других плагинов.

Вы можете указать это в редакторе Eclipse MANIFEST.MF на вкладке «Runtime», «Exported Packages».

+0

Я думал, что export-package использовался, когда я хочу, чтобы другие узлы могли ссылаться на вещи из моего пакета. я использую только сторонний JAR внутри, поэтому мне не нужно подвергать его другим путям, зачем его нужно экспортировать? –

+0

Благодарю вас за помощь. Я попытался сделать это (я добавил пространство имен сторонних JAR в таблицу экспортированных пакетов), и это не решило проблему. –

+0

Я нашел обходное решение (см. Мое редактирование, затмение было болью). извините за то, что тратили свое время, и благодарю вас за помощь. –

Смежные вопросы