2009-06-03 5 views
1

Derzeit versuche ich einige Bundles mit den Fähigkeiten der EclipseStarter-Klasse auszuführen. Wenn ich mein Programm direkt von Eclipse aus starte, wird das OSGi-Service-Paket geladen und ich kann andere Pakete installieren und starten.Wie konfiguriere ich eine OSGi-Umgebung, so dass sie aus der EclipseStarter-Klasse verwendet werden kann?

Aber wenn ich mein Java-Programm in eine ausführbare JAR-Datei exportiere und es von der Befehlszeile aus starte, lädt die Umgebung ein Bündel namens "System Bundle [0]" anstelle des OSGi-Dienstbündels. Jeder Versuch, ein neues Paket zu installieren, verursacht eine Nullpointer-Ausnahme.

Muss ich eine spezielle Konfiguration in den Framework-Eigenschaften festlegen, um die OSGi-Umgebung aus der JAR-Datei verwenden zu können? Zur Zeit bin ich nur die Einstellung der beiden folgenden Werte:

frameworkProperties.put("osgi.clean", "true"); 
frameworkProperties.put("osgi.console", "true"); 

Update:

Ich glaube, mein Problem etwas mit der verwendeten Java-Classpath zu tun haben könnte. Wenn ich den Rahmen-Bundle auf den Classpath wie dieses

java -classpath /home/markus/org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar:test.jar 
Starter.Starter 

alles hinzufügen, gut funktioniert:

osgi> ss 

Framework is launched. 

id  State  Bundle 
0  ACTIVE  org.eclipse.osgi_3.4.3.R34x_v20081215-1030 

Aber wenn ich nur die JAR-Datei ausführen Ich erhalte das folgende Fehlerprotokoll:

[email protected]:~/configuration$ cat 1244201504478.log 
!SESSION 2009-06-05 13:31:44.895 ----------------------------------------------- 
eclipse.buildId=unknown 
java.version=1.6.0_13 
java.vendor=Sun Microsystems Inc. 
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=de_DE 
Command-line arguments: -clean -console 

!ENTRY org.eclipse.osgi 4 0 2009-06-05 13:31:44.897 
!MESSAGE An unexpected runtime error has occurred. 
!STACK 0 
java.lang.NullPointerException 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.readStateData(BaseStorage.java:743) 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getStateManager(BaseStorage.java:698) 
     at org.eclipse.osgi.baseadaptor.BaseAdaptor.getState(BaseAdaptor.java:390) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter$1.bundleChanged(EclipseStarter.java:307) 
     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1234) 
     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211) 
     at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1518) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1469) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:281) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.launch(StartLevelManager.java:247) 
     at org.eclipse.osgi.framework.internal.core.SystemBundle.resume(SystemBundle.java:201) 
     at org.eclipse.osgi.framework.internal.core.Framework.launch(Framework.java:644) 
     at org.eclipse.osgi.framework.internal.core.OSGi.launch(OSGi.java:51) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:313) 
     at CanEmulator.OSGiFramework.run(OSGiFramework.java:119) 
     at java.lang.Thread.run(Thread.java:619) 

!ENTRY System Bundle 4 0 2009-06-05 13:31:44.898 
!MESSAGE 
!STACK 0 
java.lang.NullPointerException 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.readStateData(BaseStorage.java:743) 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getStateManager(BaseStorage.java:698) 
     at org.eclipse.osgi.baseadaptor.BaseAdaptor.getState(BaseAdaptor.java:390) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter$1.bundleChanged(EclipseStarter.java:307) 
     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1234) 
     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211) 
     at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1518) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1469) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:281) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.launch(StartLevelManager.java:247) 
     at org.eclipse.osgi.framework.internal.core.SystemBundle.resume(SystemBundle.java:201) 
     at org.eclipse.osgi.framework.internal.core.Framework.launch(Framework.java:644) 
     at org.eclipse.osgi.framework.internal.core.OSGi.launch(OSGi.java:51) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:313) 
     at CanEmulator.OSGiFramework.run(OSGiFramework.java:119) 
     at java.lang.Thread.run(Thread.java:619) 

Derzeit verwende ich die Framework-Jar-Datei als externe Bibliothek in meinem Eclipse-Projekt. Ich denke, dass irgendwas schief geht, wenn ich mein Projekt in eine ausführbare Datei exportieren ...

BR,

Markus

+1

Integrieren Sie ein OSGi-Framework in Ihre Anwendung? Oder ist es nur ein Paket, das in einer anderen Framework-Instanz ausgeführt werden soll? Welches OSGi-Framework verwenden Sie? – Cogsy

+0

Ich verwende das neueste Equinox OSGi-Framework: org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar – Markus

Antwort

3

Ich möchte hinzufügen, auch die folgenden Eigenschaften

osgi.noShutdown=true 

osgi.configuration.area= (path) 
osgi.baseConfiguration.area= (path) 
osgi.sharedConfiguration.area= (path) 
osgi.instance.area= (path) 
osgi.user.area= (path) 

Die erste sagt Equinox, nicht aufzuhören. Dies ist erforderlich, wenn Sie keine Eclipse-Anwendung erstellen. Die anderen sind Pfade, wo verschiedene Dateien gehen sollten. Wenn Sie die Konsole verwenden möchten, tun Sie einfach

osgi.console= 

Keine Notwendigkeit für einen Wert. Wenn Sie eine Nummer eingeben, wird dies ein Telnet-Port sein, an dem Sie die Konsole sehen können.

Jetzt, wie für Ihre Bundles, werden Sie immer das System-Bundle sehen. Das ist OSGi selbst. Um weitere Pakete hinzuzufügen, müssen Sie sie installieren. Sie können sie über die Konsole oder über Config installieren mit:

osgi.bundles= (comman delim list of bundle paths) 

Sie bündelt das System-Bundle mit Instanz programmatisch installieren können, die Sie von der EclipseStarter erhalten.

Wenn diese nicht funktionieren, laden Sie bitte einen Stack-Trace oder die osgi-Log-Datei hoch (möglicherweise finden Sie die osgi-Log-Datei in Ihrem Arbeitsverzeichnis oder "osgi.configuration.area"). Es wird eine Datei sein, deren Name rein numerisch ist.

+1

Hallo! Nach dem Hinzufügen dieser Parameter beginnt das Framework überhaupt nicht. Wenn ich es nun aus der JAR-Datei heraus starte bekomme ich eine java.lang.NullPointerException. Daher gibt es keine osgi-Protokolldatei. – Markus

Verwandte Themen