Как создать пакет OSGi с помощью Maven, который включает ресурсы, не относящиеся к коду, из фрагмента OSGi?

У меня есть фрагмент OSGi, содержащий ресурсы, не относящиеся к коду, - это, по сути, файл JAR, содержащий набор ресурсов (файлы изображений и т. Д.), - который я создал с помощью maven.

Я хотел бы собрать еще один пакет с Maven, который зависит от фрагментов с ресурсами. То есть, когда код в этом комплекте выполняется, я хочу, чтобы ресурсы из моего фрагмента были загружены и доступны с помощью команды Java getResources().

Как я могу это сделать?

1 ответ

Если вы собираете с помощью плагина bnd maven bundle, вы можете просто сделать com.example.resource, com.example.images. Это скопирует ресурсы из пути к классу maven в ваш собственный jar. Если у вас есть фрагмент в каком-то известном месте, вы также можете сделать @ resources / фрагмент.jar. Символ @ указывает bnd извлечь содержимое данного jar-файла и включить его в комплект.

Другое решение - сделать ваш пакет не фрагментом, а обычным пакетом и позволить ему зарегистрировать объект. Во время выполнения вы получаете этот сервис и делаете из него getClass(). GetResource():

 Object resource;

 @Reference(target="resource=myresource")
 void setObject(Object o) {
   this.resource = o;
 }


 void foo() {
       URL u = resource.getClass().getResource();
       ...
 }

Единственное, что вам нужно сделать в пакете ресурсов, - это зарегистрировать сервис, который вы легко можете сделать с активатором (активатор, конечно, должен находиться в этом пакете). Кроме того, вы можете написать расширитель с помощью BundleTracker. Вы помещаете заголовок в манифест, а когда обнаруживаете, вы регистрируете сервис, который предоставляет ресурсы. Наконец, вы также можете найти пакет в установленном наборе и прочитать ресурсы оттуда.

В целом, эти решения, основанные на сервисах, гораздо более гибкие, чем (к сожалению) более известные "хаки" загрузчика классов.

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