Замена классов / ресурсов фрагментом OSGi - возможно, без включения в него фляги?

Мы хотим заменить определенные ресурсы в пакете OSGi хоста, добавив фрагмент OSGi.

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

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

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

Bundle-ClassPath: patch.jar,.

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

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

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

3 ответа

Решение

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

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

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

  2. Во фрагменте build.properties измените source.. = src/ а также output.. = bin/ в source.patch/ = src/ а также output.patch/ = bin/

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

Пример:

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

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

  • Создать MessageDialog класс в com.example.ui пакет (не com.example.ui.fragment);

  • Отредактируйте файл build.properties фрагмента следующим образом:

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

    Bundle-ClassPath: patch/
    
  • в com.example.ui манифест изменения пути к классу пакета:

    Bundle-ClassPath: patch/,. 
    

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

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

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

Другие вопросы по тегам