2011-01-12 18 views
21

Chciałbym móc łatwo uruchomić frameworki OSGi (najlepiej Equinox) i załadować wszystkie pakiety wymienione w mojej pom od głównej java.Programowo uruchomić OSGi (Equinox)?

Czy to możliwe? Jeśli tak to jak?

Wygląda na to, że zrobiłyby to narzędzia Pax, ale nie mogę znaleźć żadnej dokumentacji wskazującej na takie. Wiem, że mogę uruchomić Equinox tak:

BundleContext context = EclipseStarter.startup((new String[] { "-console" }), null); 

Ale chciałbym zrobić więcej - jak powiedziałem: pokaż więcej wiązek w, może uruchomić niektórych usług itp

Odpowiedz

45

Wszelkie ramy OSGi (R4.1 lub później) może być uruchamiany programowo pomocą FrameworkFactory API:

ServiceLoader<FrameworkFactory> ffs = ServiceLoader.load(FrameworkFactory.class); 
FrameworkFactory ff = ffs.iterator().next(); 
Map<String,Object> config = new HashMap<String,Object>(); 
// add some params to config ... 
Framework fwk = ff.newFramework(config); 
fwk.start(); 

Ramy OSGi już działają. Od Framework rozciąga Bundle można nazwać getBundleContext i wezwać wszystkich normalnych metod API do manipulowania wiązek, zarejestruj usług, itd. Na przykład

BundleContext bc = fwk.getBundleContext(); 
bc.installBundle("file:/path/to/bundle.jar"); 
bc.registerService(MyService.class.getName(), new MyServiceImpl(), null); 
// ... 

Wreszcie należy po prostu poczekać na ram do zamykania:

fwk.stop(); 
fwk.waitForStop(0); 

Powtórzmy, to podejście działa dla dowolnej struktury OSGi, w tym Equinox i Felix, po prostu umieszczając ramowy plik JAR w ścieżce klas.

+0

To bardzo pomocne, dzięki. Miałem problemy z uruchamianiem i zatrzymywaniem frameworka (przekierowanie System.in nie jest takie atrakcyjne). Moim jedynym powodem do zaakceptowania jest to, że chciałbym móc wczytać moje pakiety z mojej specjalnej ścieżki klasowej bez konieczności szyfrowania kilku ścieżek i nic. Z drugiej strony, być może pragnę za dużo :) – javamonkey79

+0

Co masz na myśli mówiąc o ścieżce klasowej Mavena? –

+0

Naprawdę wszelkie zależności w moim POM - chciałbym móc je wykryć i zainstalować. – javamonkey79

2

Edit: Zrealizowane cię chciałem zacząć od wewnątrz java. Wstyd mi, że nie czytam wystarczająco blisko:

Zobacz ten link. http://www.eclipsezone.com/eclipse/forums/t93976.rhtml

Zasadniczo

public static void main(String args[]) throws Exception { 
    String[] equinoxArgs = {"-console","1234","-noExit"}; 
    BundleContext context = EclipseStarter.startup(equinoxArgs,null); 
    Bundle bundle = context.installBundle(
    "http://www.eclipsezone.com/files/jsig/bundles/HelloWorld.jar"); 
    bundle.start(); 
} 

Edit: Maven

Wydaje się, że https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 zawiera OSGi URL Handlers usługi, które mogą wziąć adresy URL następujących pakietach wielkoformatowych i obciążenia z nich (mvn: // repo/bundle_path)

+0

Mam już większość z tego i rozważałem również ładowanie z adresu http - czy wiesz, jak załadować pakiety z maven? – javamonkey79

+0

@ javamonkey79 Nigdy nie używałam maven. Ale https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 wygląda obiecująco. – KitsuneYMG

+0

@KitsuneYMG: Link do google jest uszkodzony. Czy masz jakiś inny link, który mogą korzystać? Dzięki za pomoc .. – ferhan

5

Ten wątek może być nieco przestarzały, ale w każdym razie ...

Pax ma doskonałe wsparcie dla maven adresów URL, to nawet nie ma obsługi okład url pozwalającą na dynamiczne konwertować non-OSGi słoik do przyjemnych czystymi wiązkach.

http://wiki.ops4j.org/display/paxurl/Mvn+Protocol

<dependency> 
     <groupId>org.ops4j.pax.url</groupId> 
     <artifactId>pax-url-wrap</artifactId> 
     <version>1.2.5</version>   
    </dependency> 
    <dependency> 
     <groupId>org.ops4j.pax.url</groupId> 
     <artifactId>pax-url-mvn</artifactId> 
     <version>1.2.5</version>   
    </dependency> 

Komenda będzie wówczas:

install -s mvn:groupId:artifactId:version:classifier 

Uwaga: kurczak, jajko scenariusz - trzeba je zainstalować przy użyciu pliku: obsługi url pierwszy lub umieścić je w autodeploy informator.

Karaf ma to wszystko wbudowane w jego dystrybucję, więc może warto rzucić okiem na źródło wyrzutni Karaf?

2. UWAGA: rozmieszczanie Migawki są umożliwić dołączając @snapshots do adresu URL repo, konfiguracja jest zarządzany przez ConfigAdmin

Pod względem zarządzania wszystkimi POM zdefiniowane zależności przyjrzeć się Karaf cechy - jest to plugin, który będzie umożliwiają wygenerowanie pliku funkcje XML, który może być następnie wykorzystana do wdrożenia całego app: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html

Co więcej ten XML artefakt może zostać wdrożony do OBR, więc można wziąć wanilię konfiguracji Felix/Equinox/Karaf, dodać program obsługi mvn url i skonfiguruj z repozytorium mvn firmy, a następnie udostępnij całą aplikację =)

Powiązane problemy