Как создать пакет 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. Вы помещаете заголовок в манифест, а когда обнаруживаете, вы регистрируете сервис, который предоставляет ресурсы. Наконец, вы также можете найти пакет в установленном наборе и прочитать ресурсы оттуда.
В целом, эти решения, основанные на сервисах, гораздо более гибкие, чем (к сожалению) более известные "хаки" загрузчика классов.