получить все реализации API - PullRequest
0 голосов
/ 28 марта 2012

Я написал 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, как я могу получить эту информацию из фреймворка?

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

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

1 голос
/ 29 марта 2012

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

for ( File b : bundles.listFiles() ) {
    ctx.installBundle( b.toURI().toURL() );
}

Каждый из этих пакетов должен выглядеть (используя DS):

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

Пакет, собирающий услуги, может выглядеть следующим образом:

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

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

1 голос
/ 28 марта 2012

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

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

, чтобы получить все реализации данного сервиса.

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

...