# GWT nach OSGi konvertieren



## kemot (7. Jan 2011)

Hallo Leute...

Ich versuche gerade mein GWT (google web toolkit) Projekt so umzuändern/konvertieren, dass es unter einem OSGi Framework läuft, also ein PulgIn wird.
Gibt es da tools die das ganze automatischt anpassen.
Die Struktur eines OSgi-PluIns ist mir klar aber manuelle schaf ich es nicht hin.

Würde mich über ein Feeback freuen..

Gruß
Kemot


----------



## fkh (11. Jan 2011)

Hallo kemot,

ich habe das vor einiger Zeit mal gemacht, werde mal schauen ob ich noch ein Beispielprojekt finde. Du musst auf jeden Fall die GWT-Library in ein OSGi-Bundle überführen. Dazu gibts aber einige Tools, die das für dich übernehmen. Ich persönlich bevorzuge die von Eclipse PDE angebotene Funktionalität (File - New - Other - Plug-in Development - Plug-in from Existing JAR Archive - Add External), wenn du im New-Wizard noch den Haken bei "Analyze library contents and add dependencies" setzt, kann dir Eclipse die Abhängigkeiten in der Manifest pflegen. Wenn ich mich recht erinnere, habe ich jedoch alle javax.servlet packages nachträglich entfernt, weil die bei mir bereits von anderen Bundles zur Verfügung gestellt werden.

Ich habe damals GWT mit Equinox genutzt und es war nicht wirklich angenehm. Am Ende lief es zwar, aber ich musste dafür  angepasste Ant build-files, angepasste run-configuration für das GWT Plugin, veränderte Ordnerstrukturen etc. nutzen. Auch der Umstand, dass das JavaScript immer kompiliert werden muss, beißt sich etwas mit der Modularität von OSGi. Eine andere Alternative zu GWT wäre Vaadin (kommt schon OSGi-ready daher), dass sehr ähnlich ist jedoch einen serverseitigen Ansatz verfolgt. Glücklich geworden bin ich aber auch mit Vaadin in Verbindung mit OSGi nicht. Derzeit versuche ich mich gerade mit Eclipse RAP und erhoffe mir davon die gewünschte Modularität für meine Web-Anwendungen. Ansonsten gibts noch die Möglichkeit, konventionelle Web-Anwendungen mit eigenem JavaScript anzureichern. Hierzu sei auf Jörg Viola: Eclipse Virgo + Snaps: Modular Web Apps, finally, Part 1 verwiesen, wo gezeigt wird wie sowas aussehen könnte.

 Ich weiß jetzt nicht, welches OSGi-Framework du benutzt, würde dir aber empfehlen mal einen Blick auf Eclipse Virgo und EclipseRT zu werfen. Dort hast du die Möglichkeit, erstmal die war-Files unverändert in einem eingebetteten Tomcat (bald hoffentlich auch Jetty) ausführen zu lassen. Dann kannst du schrittweise dein war in ein Web Application Bundle (oder so ähnlich) überführen indem du zuerst die Abhängigkeiten über die MANIFEST.MF anstatt den lib-Ordner bereitstellst und später dann auch OSGi-Services nutzt (Stichwort Gemini Blueprint). Imo ist Virgo derzeit die fortschrittlichste Runtime im Bereich OSGi, gibt aber mit EclipseRT, Apache Karaf und Apache Aries noch andere sehr interessante Projekte im Bereich OSGi.

 Gruß
 fkh

 PS: Bei Fragen zu OSGi/GWT solltest du diese imo besser im Bereich Plattformprogrammierung stellen, zu SOA passt das nicht.


----------



## kemot (13. Jan 2011)

Vielen Dank erstmals für deine Antwort..

Ich habe ein paar offene Fragen, vll. kannst Du mir ein paar Tipps geben.

Wie wäre die richtige Vorgehensweise?
Zuerste, mit Eclipse ein GWT-Projekt erzeugen. 
Wie gehts es weiter? 
Du hast geschrieben, dass ich die GWT-lib in ein Osgi-Bundle überführen soll, aber es ist noch kein Bundle vorhanden. 
Weiterhin arbeitest du mit Eclipse und dem Wizard (File - New - Other - Plug-in Development - Plug-in from Existing JAR Archive - Add External). 
So wie ich es verstanden habe, erzeugt dieses Vorgehen aus einer beliebigen jar Datei, eine PlugIn Projekt. Also müsste hier die GWT-lib importiert werden, oder?
Es kommen noch die "war" Ordner und alles weitere, muss ich damit auch was machen?
Als letztes könnte ich als das Pluin mithilfe des export Wizards für PlugIns exportieren?
Arbeite auf dem Prosyst Framework.

Danke im Vorraus..


----------



## fkh (17. Jan 2011)

Hallo Kemot,



kemot hat gesagt.:


> Du hast geschrieben, dass ich die GWT-lib in ein Osgi-Bundle überführen soll, aber es ist noch kein Bundle vorhanden. Weiterhin arbeitest du mit Eclipse und dem Wizard (File - New - Other - Plug-in Development - Plug-in from Existing JAR Archive - Add External). So wie ich es verstanden habe, erzeugt dieses Vorgehen aus einer beliebigen jar Datei, eine PlugIn Projekt. Also müsste hier die GWT-lib importiert werden, oder?



Die GWT-Bibliotheken sind von Haus aus nicht für den Einsatz in einem OSGi-Framework geeignet (es fehlen die entsprechenden Header-Einträge in der Manifest). Mit Hilfe des Eclipse-Assistenten bist du in der Lage, auf einfache Weise ein OSGi-Bundle aus den GWT-Bibliotheken erstellen zu lassen (inkl. der entsprechenden Manifest-Einträge). Das dadurch entstehende Eclipse-Projekt kannst du anschließend via "Export - Plug-in Development - Deployable plug-ins and fragments" exportieren und als Ergebnis erhälst du ein OSGi-kompatibles Bundle als jar-Datei. Dieses Bundle lässt sich dann in einem beliebigen OSGi-Framework deployen und von deinem noch zu erstellenden GWT-Projekt anschließend mittels Import-Package oder Require-Bundle einbinden. Mit diesem Ansatz können später mehrere deiner GWT-Projekte auf das gleiche GWT-Bundle zugreifen. Die andere Alternative wäre, die GWT-Bibliotheken in deinem Bundle über den Classpath zu referenzieren, dann müssen die meines Wissens auch nicht "OSGi-ready" sein. Dann kann aber auch nur das jeweilige Bundle die GWT-Libs nutzen, was meiner Meinung nach nicht dem Grundgedanken von OSGi entspricht. 

Nachdem du jetzt dein GWT-Bundle erstellt hast, musst du jetzt noch ein Bundle mit deinem GWT-Projekt erstellen und wie bereits gesagt im Manifest des zweiten Bundles die Abhängigkeit zum ersten Bundle (den OSGi-kompatiblen GWT-Libs) pflegen. Hier fängt die ganze Sache an umständlich zu werden. Das Kompilieren des JavaScript-Codes habe ich über ein Ant-File geregelt, wobei natürlich auch die Kompilierung via Eclipse-Plugin oder on-the-fly für die Entwicklung funktioniert (mit den entsprechenden Parametern in der URL ?gwt.codesvr=127.0.0.1:9997). Im Activator des Bundles (bzw. DS/SpringDM oder was du auch benutzt) musst du die entsprechenden Servlets/Resourcen registrieren (Stichwort HttpService). Außerdem musst du in der launch-Configuration den eingebetteten Server deaktivieren, da die Bundles jetzt ja im Servlet-Container des OSGi-Frameworks laufen. Alles in allem lief das ganze nicht annähernd so rund wie man es von der konventionellen GWT-Entwicklung her kennt und ich habe es wieder verworfen.

Ich kenne mich mit Prosyst nicht aus, kann dir daher nicht viel zu diesem OSGi-Framework sagen. Vielleicht hast du Glück und Prosyst hat schon Support für RFC66 oder du kannst den RFC66-Support von Eclipse Gemini in Prosyst einbinden. In dem Fall wäre das alles ungemein einfacher, weil du dort war-Dateien deployen und diese Schrittweise auf OSGi adaptieren kannst. 

Gruß
fkh


----------

