Замена классов / ресурсов фрагментом OSGi - возможно, без включения в него фляги?
Мы хотим заменить определенные ресурсы в пакете OSGi хоста, добавив фрагмент OSGi.
Насколько я понимаю, ресурсы, включенные во фрагмент OSGi, просто добавляются в путь к классам пакета узла. Нет гарантии, что, если фрагмент добавляет ресурс, который уже существует в пакете хоста, ресурс из фрагмента будет загружен: он также может быть версией хоста.
Чтобы убедиться, что фрагментная версия ресурса загружена вместо версии хоста, http://wiki.osgi.org/wiki/Fragment упоминает, что можно использовать заголовок Bundle-ClassPath для указания ресурсов как "первых". (предпочтительнее).
Это дает patch.jar в качестве примера:
Bundle-ClassPath: patch.jar,.
Как уже упоминалось: "Так как patch.jar опережает '.' это позволит преимущественно загружать классы из фрагмента, а не из хоста. "
Я мог бы использовать эту технику, но это означает, что сначала я должен собрать свои ресурсы фрагментов в отдельную банку, а затем включить эту банку в комплект фрагментов.
Есть ли способ преимущественно загружать классы / ресурсы из фрагмента, а не из хоста, без необходимости включать jar в фрагмент?
3 ответа
Вам не нужно включать банку. Вместо этого вы можете использовать каталог "patch", а затем поместить ваши классы в каталог patch во фрагменте.
Для тех, кто все еще борется, вот точные шаги, которые работали для меня:
Создайте фрагмент проекта с ресурсом / классом, который вы хотите заменить
Во фрагменте build.properties измените
source.. = src/
а такжеoutput.. = bin/
вsource.patch/ = src/
а такжеoutput.patch/ = bin/
В манифесте фрагмента добавьте
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.