2014-01-20 3 views
2

Мы хотим заменить определенные ресурсы в пакете OSGi хоста, добавив фрагмент OSGi.Замена классов/ресурсов фрагментом OSGi - возможно без включения флага в фрагменте?

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

Для того, чтобы загрузить версию фрагмента ресурса вместо версии хоста, http://wiki.osgi.org/wiki/Fragment упоминает, что можно использовать заголовок Bundle-ClassPath, чтобы указать ресурсы как «первые» (предпочтительные).

Это дает patch.jar в качестве примера:

Bundle-ClassPath: patch.jar,. 

Как уже упоминалось здесь: «Так как patch.jar впереди". это позволит классам преимущественно загружаться из фрагмента вместо хоста ».

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

Есть ли способ преимущественной загрузки классов/ресурсов из фрагмента вместо хоста без необходимости включать в фрагмент банку?

ответ

4

Вам не нужно включать банку. Вместо этого вы можете использовать каталог «patch», а затем поместить свои классы в каталог патча в фрагменте.

1

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

Чтобы выполнить это, в Manifest.MF вашего пакета библиотеки укажите явные пакеты, которые вы хотите экспортировать, вместо «.». Вы можете сделать это с помощью фрагмента, чтобы вам не пришлось изменять исходный пакет. Затем сделайте то же самое с вашим пакетом патчей.

Другой вариант - использовать плагин maven-bundle для «затенения» (объединения) пакета патчей и библиотеки вместе в новый пакет. Пока пакет патчей и его библиотека имеют разные номера версий, это также сработает. Многие блоги проинструктируют вас использовать плагин maven-shade вместе с плагином maven-bundle для этой опции, но они неверны. Вы можете выполнить затенение с помощью модуля maven-bundle-plugin.

0

Для тех, кто еще борется, это точные шаги, которые работали для меня:

  1. Создать фрагмент проекта с ресурса/класс, который вы хотите заменить

  2. В сборке фрагмента .properties, измените 'source .. = src /' и 'output .. = bin /' to 'source.patch/= src /' и 'output.патч/= бен/'

  3. В манифеста фрагмента, добавьте 'заплатки /' расслоению класса тропу

Пример:

Допустим, у вас есть' com.example .ui ", который имеет класс com.example.ui.MessageDialog, который вы хотите заменить.

  • Создание проекта фрагмент '' com.example.ui.fragment

  • Создать класс 'MessageDialog' в пакете 'com.example.ui' (не «com.example.ui. фрагмент');

  • Редактировать build.properties фрагмента файла, как это:

    source.patch/ = src/ 
    output.patch/ = bin/ 
    
  • В манифесте фрагмента добавить следующее:

    Bundle-ClassPath: patch/ 
    
  • В 'com.example.ui' Manifest изменить пучка:

    Bundle-ClassPath: patch/,.