Получить все реализации API
Я написал 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 ответа
Кажется, вы только загружаете пакет 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 и многих других помощниках.
Похоже, вы пытаетесь повторно реализовать реестр служб OSGi. Взгляните на Blueprint или декларативные услуги вместо этого. По крайней мере, я бы предложил использовать сервисный API OSGi для регистрации и использования сервисов.
Учитывая, что рамки также Bundle
Вы можете получить BundleContext
это позволяет вам найти все необходимые вам услуги. Вы могли бы сделать что-то вроде
m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null)
получить всех разработчиков данного сервиса.
Тем не менее, вы должны знать, что вы живете в другой загрузчик классов, чем жители вашей структуры.