OSGi [Felix] Einsteigerfragen

T

Tomate_Salat

Gast
Hi,
ich setze mich gerade verstärkt mit OSGi auseinander (als Basis Felix). Als Übungsszenario hab ich mir überlegt: Einen Server als Consolenanwendung und später ein Bundle, welches ein GUI dafür bereitstellt + unendlich viele Plugins dafür.

Jz stellte sich erst einmal die Frage: Embedded oder nicht? Natürlich wollte ich erst mal das ganze Embedded haben, entschied mich dann aber doch dagegen. Grund: beides läuft aufs gleiche drauf heraus und die config ist schneller angepasst, als das man einen eigenen Launcher implementiert.

"Jetzt kanns losgehen" dachte ich und entdeckte kurz danach einen Konflikt: sowohl die Felix shell als auch mein Server sind (erstmal) Consolenbasierend. Eine elegante Problemlösung habe ich noch nicht gefunden. Ich dachte ich aktiviere telnetd und greife lokal über einen telnetclient auf die shell zu, wenn ich sie benötige. Habt ihr hier iwelche Vorschläge, oder wie macht ihr das?

Mein nächstes Problem: die Startreihenfolge:
Kann man bestimmen, in welcher Reihenfolge bundles gestartet werden sollen? Ich dachte vllt über das (bundle)level. Setze ich das aber hoch, kann ich das Bundle nicht mehr starten (iwie nicht gut :D).
 

Wildcard

Top Contributor
"Jetzt kanns losgehen" dachte ich und entdeckte kurz danach einen Konflikt: sowohl die Felix shell als auch mein Server sind (erstmal) Consolenbasierend. Eine elegante Problemlösung habe ich noch nicht gefunden. Ich dachte ich aktiviere telnetd und greife lokal über einen telnetclient auf die shell zu, wenn ich sie benötige. Habt ihr hier iwelche Vorschläge, oder wie macht ihr das?

Da du gerade eh nur am einarbeiten bist, nimm doch Equinox statt Felix. Equinox ist direkt bei Eclipse mit dabei, es kann also gleich losgehen, ausserdem bietet Equinox schon eine super einfache Möglichkeit um neue Kommandos für die OSGi Konsole bereitzustellen
Using Equinox CommandProvider to make OSGi console interactive. ~ Sarath Chandra Pandurangi's Blog
Felix hat vielleicht etwas ähnliches, da muss ich allerdings passen.

Mein nächstes Problem: die Startreihenfolge:
Kann man bestimmen, in welcher Reihenfolge bundles gestartet werden sollen?
Ja, das geht über Start Levels, allerdings solltest du nur bei ganz wenigen Bundles manuell daran herumspielen. Im normalfall überlässt man es dem Framework welches Bundle wann gestartet wird.
Am Anfang, wenn du auf Konsole entwickelst, kannst du die Bundles einfach über die Konsole starten.
 
T

Tomate_Salat

Gast
:p Felix habe ich auch schon da und könnte gleich loslegen (hab sogar schon losgelegt^^). Naja, aber mal unabhängig vom Framework: Erweitert man wirklich die Equinox/Felix-Konsole um weitere Befehle, wenn man soetwas vorhat wie ich? Ich hatte zwar vermutet, dass soetwas geht, aber meine Idee driffteten eher dahin ab, bestimmte Funktionalitäten der Console nachzubauen (mehr oder minder gut. Hat aber immerhin mehr Verständniss für OSGi gebracht :) ).
 

Wildcard

Top Contributor
Befehle, wenn man soetwas vorhat wie ich?
Das 'was' du vor hast ist mir noch nicht ganz klar geworden. Du hast wohl nicht vor das die Oberfläche (in guter alter Linux Tradition) die Funktionalität der Anwendung über die Konsole steuert, oder? Insofern ist doch erstmal völlig egal ob du eine eigene Konsole entwickelst, oder eine bestehende verwendest, insofern würde ich den Weg des geringsten Widerstands gehen und die OSGi Konsole verwenden.
 
T

Tomate_Salat

Gast
doch eigentl. genau das. Ich wollte eine (erstmal triviale) Serveranwendung schreiben, die man über die Konsole verwaltet. Danach wollte ich ein bundle schreiben, welches ein GUI anbietet. Jz könnte man nach dem Sinn fragen: einfach nur zu übungsszwecken.
 

Wildcard

Top Contributor
Danach wollte ich ein bundle schreiben, welches ein GUI anbietet. Jz könnte man nach dem Sinn fragen: einfach nur zu übungsszwecken.
Aber die GUI über die Konsole mit der Anwendung kommunizieren lassen?
Na ich weiß nicht, das finde ich schon sehr schräg.
Die Konsole ist zwar keine GUI, aber ein UI. Das UI ist die Schnittstelle des Anwenders zur Programmfunktionalität. Eine GUI zu schreiben die über ein anderes UI mit dem Programm kommuniziert scheint ziemlich schräg wenn stattdessen direkt die Funktionalität ansprechen könnte die der Konsoleninterpreter verwendet.
Wenn es dir darum geht textuelle Kommandos über ein Socket abzusetzen, oder ähnliches, würde ich dir zu Net4j raten. (Oder auch einfach Jabber).
 
T

Tomate_Salat

Gast
Nein um die Netzwerkgeschichte gehts mir momentan noch überhaupt garnicht. Primär geht es mir darum, OSGi kennen zu lernen + damit umzugehen und da ich noch nicht viel mit Netzwerken gemacht habe, dachte ich mir: das könntest du auch mit reinbringen.

Vllt auch mal ein wenig Hintergrund: ich habe schon vor ein paar Wochen angefangen, mich mit OSGi auseinander zu setzen und hab RCP gleich mitgenommen ... iwann hab ich nur noch RCP gemacht. Als ich gemerkt habe, das lenkt mich zu sehr ab, habe ich mich für Felix entschieden. Da ich in der Zukunft vorhabe, ein Umfangreicheres Finanzverwaltungsprojekt zu entwickeln, wollte ich schon mal Aspekte davon in dieses Übungsprojekt mit einfließen lassen (deswegen ist zur Übung ein Server geplant & dem reicht ja als UI erstmal eine Console).
 

Wildcard

Top Contributor
deswegen ist zur Übung ein Server geplant & dem reicht ja als UI erstmal eine Console
Das ist ja auch völlig ok, ich meine ja nur: wenn deine Applikation und die GUI sogar im gleichen OSGi Container laufen, dann schein es unnötig kompliziert die Applikation über die GUI mit Konsolencommandos zu steuern.
iwann hab ich nur noch RCP gemacht. Als ich gemerkt habe, das lenkt mich zu sehr ab, habe ich mich für Felix entschieden
Welche OSGi Implementierung du verwendest ist gar nicht so wichtig. Wenn du in Eclipse ein Plugin-Projekt anlegst und das Target Platform Standard OSGi Framework angibst, dann funktioniert das später sowohl in Felix als auch Equinox. Anders gesagt: du kannst Equinox verwenden ohne gleich in die RCP Schiene zu rutschen ;)
 
T

Tomate_Salat

Gast
Das ist ja auch völlig ok, ich meine ja nur: wenn deine Applikation und die GUI sogar im gleichen OSGi Container laufen, dann schein es unnötig kompliziert die Applikation über die GUI mit Konsolencommandos zu steuern.
ich dachte da eher an eine Api die ich als Service bereit stelle.

Welche OSGi Implementierung du verwendest ist gar nicht so wichtig. Wenn du in Eclipse ein Plugin-Projekt anlegst und das Target Platform Standard OSGi Framework angibst, dann funktioniert das später sowohl in Felix als auch Equinox. Anders gesagt: du kannst Equinox verwenden ohne gleich in die RCP Schiene zu rutschen ;)
:) sehr gut, diese Schiene fahre ich bereits. Meine Bundles erstelle ich nämlich bereits genau so, wie du es beschrieben hast.
 
T

Tomate_Salat

Gast
Hätte ich auch dazu schreiben können. Ich denke, ich werde einfach mal einen Server als Service schreiben und eine triviale GUI, welche diesen nutzt. Damit meine Planung einigermaßen noch umgesetzt wird, wird die erste GUI aussehen wie eine einfache Konsole :).

Ich halte diesen Thread mal offen, da ich sicherlich noch einige Fragen in Zukunft zu dem Thema haben werde.
 
T

Tomate_Salat

Gast
So, habe mal wieder ein wenig mit OSGi gespielt und dabei hat sich so ein problem ergeben. Wenn ich das Bundle entwickle und unter equinox starte, funktioniert alles (das ganze wird mit der Einstellung: standard-osgi entwickelt). Wenn ich das gleiche Bundle jz in Felix starten will, bekomme ich die Meldung:
Code:
java.lang.NoSuchMethodError: org.osgi.framework.BundleContext.getServiceReferences(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/Collection;

diese Methode rufe ich in einer anderen Klasse auf, der ich den BundleContext übergeben habe (nehme an, wenn ich es im Activator lösen würde, würde es funktionieren --> fände ich aber unschön, deswegen auch ungetestet).

Aus der Api entnehme ich mal, dass es ein Problem mit der Permission ist. Ich habe jz die (ungetestete) Möglichkeit gefunden, das über OSGI-INF/permission.perm zu lösen, nur möchte ich das nicht. Hätte das alles gerne im Source gelöst. Also mir da mal ein ServicePermission-Objekt angelegt und nun ja. Keine Ahnung wo ich das registrieren soll. Trotzdem mal getestet, ob das schon reichen würde, natürlich erfolglos.

Also kurz und knapp: wie kann ich diese Permission im Code registrieren?

Edit
Ich hab jz nochmal in den Sourcen von Felix geschaut, der kennt diese Methode i.d.T nicht. Hatte mich schon gewundert, da ich in dem Falle eine andere Exception erwartet hätte, wenn die Permission nicht stimmt. War aber der Meinung, wenn ich mit der Einstellung "Standard OSGi" entwickle, dass das Bundle dann zu kompatibel zu Felix sein müsste. Naja, das mit den Permissions wäre trotzdem noch interessant, von daher wars ja nicht komplett unnötig der Post :oops:
 
Zuletzt bearbeitet von einem Moderator:

Wildcard

Top Contributor
Ich würde mal vermuten das du mit Equinox gegen eine neuere Version der OSGi Spezifikation kompiliert hast als du später in Felix zur Verfügung hattest
 
T

Tomate_Salat

Gast
die Felix-version war aktuell (was aber nicht unbedingt viel heisen muss). Naja, ich glaube es ist eh besser, den Namen als String anzugeben, anstatt die Klasse (zumindest sehe ich es so in den ganzen Beispielen). Ein guter Grund also, dass ich mir das endlich mal anzugewöhne :).
 

Neue Themen


Oben