2013-05-23 14 views
5

Buduję niektóre moduły, które chcę eksponować jako pakiety OSGi bez rzeczywistych zależności od bibliotek OSGi. Wydaje się, że jest to możliwe przy użyciu opcji usług deklaratywnych.Używanie osadzonego kontenera OSGi

Ponieważ jestem raczej nowym użytkownikiem OSGi (przynajmniej po stronie tworzenia pakietu) chcę przetestować, czy wszystko działa tak, jak powinno, w tym celu chcę skonfigurować małe osadzone środowisko OSGi.

Obecnie mam pojedynczy pakiet, który eksportuje interfejs API, a także zapewnia implementację kodu pośredniczącego pojedynczego interfejsu.

Śledzę następujące tutoriale do skonfigurowania środowiska:

I wbudowany realizacja Felix wydaje się działać poprawnie jednak istnieją dwa problemy:

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

To wypisuje null, więc gdy pakiet pozornie zaczyna działać poprawnie, nie wydaje się, aby ujawniał jakiekolwiek usługi.

Po drugie, zastanawiam się, czy muszę zrobić coś wyjątkowego, aby usługi deklarujące się spełniły. Moi Maven zależności są:

<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> 

podstawie wątku email znaleźć tutaj: http://mail-archives.apache.org/mod_mbox/felix-users/201111.mbox/%[email protected]%3E

Próbowałem dodać paczkę do właściwości startowych felix:

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

Jednak to wydaje się nieco optymistyczne na pierwszy rzut oka. Jak włączyć usługi deklaratywne dla wbudowanego silnika felix?

Odpowiedz

6

Rozwiązaniem obu problemów było załadowanie słoika "scr" (służącego do analizowania usług deklaratywnych) jako pakunku przed załadowaniem własnych pakietów.

Ponieważ słoik znajduje się w moim repozytorium maven i powinno działać układ poprzeczny, następujący fragment kodu wczytuje słoik SCR wszędzie tam, gdzie przebywa:

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

Po tym nieco załadować własną paczkę i usługi w nim wykryte prawidłowo.

Na sidenote, można włączyć rejestrowanie dodając pewne właściwości początkowej mapie:

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

więcej właściwości można znaleźć na http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html

na przyszłość, tutaj jest cały kod użyłem Aby go uruchomić, należy:

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

Witam @nablex. Mam podobne pytanie [** TUTAJ: ** Plugin Assembly Apache Maven nie działa z pakietami OSGi] (http://stackoverflow.com/questions/34886012/apache-maven-assembly-plugin-not-working-with-osgi -bundles) i miał nadzieję, że możesz rzucić okiem i zobaczyć, czy możesz pomóc. Naprawdę utknąłem i bardzo doceniam każdą pomoc, jaką możesz zaoferować. Z góry dziękuję. –

1

Proponuję przejrzeć pax exam. Umożliwia przetestowanie pakietu w kontenerze OSGi. Fajną rzeczą jest to, że integruje się z junitem, więc twój test wygląda bardzo podobnie do normalnych testów. Dla niektórych przykładów patrz Apache Karaf Tests.