2013-05-23 2 views
5

Я создаю несколько модулей, которые я хочу представить в виде пакетов OSGi без каких-либо фактических зависимостей от библиотек OSGi. Казалось бы, это возможно с помощью параметра декларативных услуг.Использование встроенного контейнера OSGi

Однако, поскольку я довольно новичок в OSGi (по крайней мере, на стороне создания пакета), я хочу проверить, все ли работает так, как должно, для этого я хочу настроить небольшую встроенную среду OSGi.

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

Я следовал за следующие обучающие программы, чтобы создать среду:

И внедренный реализация Феликсом, кажется, работает правильно, однако есть две проблемы:

Bundle bundle = felix.getBundleContext().installBundle("/path/to/bundle.jar") 
bundle.start(); 
System.out.println(bundle.getRegisteredServices()); 

Это печатает null, поэтому, хотя пакет, похоже, начал нормально, он, похоже, не раскрывает никаких сервисов.

Во-вторых, мне интересно, нужно ли мне что-то делать, чтобы запустить и запустить декларативные сервисы. Мой зависимости Maven являются:

<dependencies> 
    <dependency> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>org.apache.felix.framework</artifactId> 
     <version>4.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>org.apache.felix.scr</artifactId> 
     <version>1.6.2</version> 
    </dependency> 
</dependencies> 

на основе электронной почты нити здесь: http://mail-archives.apache.org/mod_mbox/felix-users/201111.mbox/%[email protected]%3E

Я пытался добавить узелок свойств запуска Феликса

map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "org.apache.felix.scr; version=1.6.2"); 

Однако это кажется немного оптимистично на первый взгляд. Как включить декларативные службы для встроенного движка felix?

ответ

6

Решение обеих проблем состояло в том, чтобы загрузить баннер «scr» (используемый для анализа декларативных услуг) в виде пакета перед загрузкой моих собственных пакетов.

Поскольку сосуд находится в моем репозитории Maven, и он должен работать кросс систему, следующий фрагмент кода загружает ОПЗ баночку, где бы он проживает:

URL url = getClass().getClassLoader().getResource("org/apache/felix/scr/ScrService.class"); 
    String jarPath = url.toURI().getSchemeSpecificPart().replaceAll("!.*", ""); 
    framework.getBundleContext().installBundle(jarPath).start(); 

После этого бита я загрузить свой собственный комплект и службы в нем были обнаружены должным образом.

На Замечание, вы можете включить ведение журнала, добавив некоторые свойства исходной карты:

map.put("ds.showtrace", "true"); 
    map.put("ds.showerrors", "true"); 

Больше свойств можно найти на http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html

Для дальнейшего использования, то здесь весь код я для его запуска

private void initialize() throws BundleException, URISyntaxException { 
    Map<String, String> map = new HashMap<String, String>(); 

    // make sure the cache is cleaned 
    map.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT); 

    // more properties available at: http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html 
    map.put("ds.showtrace", "true"); 
    map.put("ds.showerrors", "true"); 

    System.out.println("Building OSGi Framework"); 
    FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next(); 
    Framework framework = frameworkFactory.newFramework(map); 

    System.out.println("Starting OSGi Framework"); 
    framework.start(); 

    // declarative services dependency is necessary, otherwise they won't be picked up! 
    loadScrBundle(framework); 

    framework.getBundleContext().installBundle("file:/path/to/myBundle.jar").start(); 

    ServiceReference reference = framework.getBundleContext().getServiceReference("my.Interface"); 
    System.out.println(framework.getBundleContext().getService(reference)); 

    for (Bundle bundle : framework.getBundleContext().getBundles()) { 
     System.out.println("Bundle: " + bundle.getSymbolicName()); 
     if (bundle.getRegisteredServices() != null) { 
      for (ServiceReference serviceReference : bundle.getRegisteredServices()) 
       System.out.println("\tRegistered service: " + serviceReference); 
     } 
    } 
} 

private void loadScrBundle(Framework framework) throws URISyntaxException, BundleException { 
    URL url = getClass().getClassLoader().getResource("org/apache/felix/scr/ScrService.class"); 
    if (url == null) 
     throw new RuntimeException("Could not find the class org.apache.felix.scr.ScrService"); 
    String jarPath = url.toURI().getSchemeSpecificPart().replaceAll("!.*", ""); 
    System.out.println("Found declarative services implementation: " + jarPath); 
    framework.getBundleContext().installBundle(jarPath).start(); 
} 
+0

Hi @nablex. У меня есть аналогичный вопрос [** ЗДЕСЬ: ** Apache Maven Assembly Plugin не работает с пакетами OSGi] (http://stackoverflow.com/questions/34886012/apache-maven-assembly-plugin-not-working-with-osgi) и надеялся, что вы можете взглянуть и посмотреть, сможете ли вы помочь. Я действительно застрял и очень ценю любую помощь, которую вы могли бы предложить. Заранее спасибо. –

1

Предлагаю взглянуть на pax exam. Это позволяет тестировать ваш пакет в контейнере OSGi. Приятно, что он интегрируется с junit, поэтому ваш тест очень похож на обычные тесты. Некоторые примеры см. В разделе Apache Karaf Tests.

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