2012-03-28 5 views
0

Я написал API Bundle и некоторые сервисы реализации.получить все реализации api

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

Я начинаю апи так:

Framework m_fwk = new org.apache.felix.framework.FrameworkFactory().newFramework(null); 
    m_fwk.init(); 
    AutoProcessor.process(null, m_fwk.getBundleContext()); 
    m_fwk.start(); 

    Bundle api = m_fwk.getBundleContext().installBundle(
    "file:/foo/bar/api/target/api-1.0.jar"); 

    api.start(); 

Так что теперь API загружен. Теперь мне нужно знать, какие пакеты реализуют этот API, как я могу получить эту информацию из фреймворка?

ответ

1

Вы загружаете только API-пакет, похоже, хотите установить другие пакеты для реализации? Большинство людей затем загрузить директор или так:

for (File b : bundles.listFiles()) {
ctx.installBundle(b.toURI().toURL());
} Каждые из этой пачки должны выглядеть (с помощью DS):

@Component
public class Impl implements API {
public whatever() { ... }
}

Бу ndle сбор услуг может выглядеть следующим образом:

@Component
public class Collector {
@Reference(type='*') void addAPI(API api) { ... }
void removeAPI(API api) { ... }
}

Это делается с БНД аннотаций для DS (см bndtools примеры). Однако вы также можете реализовать/собрать службы в Blueprint, iPojo и многих других помощниках.

+0

mh да, я хочу иметь API, который мне нужно установить явным. Затем я хочу захватить все пакеты из каталога и искать эти пакеты, которые реализуют API. Например: у меня есть плагин-API и множество плагинов.теперь я хочу загрузить все плагины, которые соответствуют версии API версии i, установленной ранее. Я думаю, что ваш пример будет делать это правильно? – reox

2

Похоже, вы пытаетесь переустановить системный реестр OSGi. Вместо этого взгляните на Blueprint или Declarative Services. По крайней мере, я бы предложил использовать API-интерфейс OSGi для регистрации и использования сервисов.

1

Учитывая, что Framework также является Bundle, вы можете получить BundleContext, что позволит вам найти все необходимые вам услуги. Вы могли бы сделать что-то вроде

m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null) 

, чтобы получить всех исполнителей данной услуги.

Однако вы должны знать, что вы живете в другом загрузчике классов, чем жители вашего каркаса.

+1

но это будет работать только в том случае, если услуга установлена ​​правильно? – reox

+0

Ну, вам нужно знать, что у жителей фреймворка есть другой вид вашего интерфейса, чем у вас. Если вы просто хотите, чтобы все разработчики, не беспокоясь о назначении, использовали 'getAllServiceReferences'. (Если это свойство присваивания ослепляет вас, вы можете прочитать об обработке класса OSGi.) –

Смежные вопросы