# Spring DM 2.0 und Eclipse RCP



## quiddix (22. Feb 2010)

Hallo,

ich bin aktuell auf der Suche nach Anleitungen / Tutorials zu Spring DM 2.0 für Eclipse RCP Anwendungen. Leider finde ich eigentlich nur alte Tutorials, die sich auf Spring DM 1.x beziehen, oder die nicht für Einsteiger geeignet sind.

Deshalb wollte ich fragen, ob es hier jemanden gibt der sich mit diesem Thema bereits beschäftigt hat und eventuell Links bereitstellen kann, oder eine kleine Anleitung verfassen kann, wie man die Bundles von Spring DM 2.0 in Eclipse RCP importiert.

Danke


----------



## Gast2 (22. Feb 2010)

Spring DM 2.0 habe ich noch nicht zum Laufen gebracht. Spring 1.2.1 klappt eigentlich.
Hier hab ich ein Tutorial 
Eclipse Magazin 16 - Die Stärke der Drei
Tutorial: Spring OSGi + Eclipse RCP

Du musst dir die Bundles runterladen und deine Target Platform erweitern.


----------



## quiddix (22. Feb 2010)

Hi,

habe diese Tutorials auch schon gefunden. Leider kann/darf ich die Target-Pattform nicht erweitern (Projektspezifische Vorgaben).

Ich habe auch gelesen, dass in die Target-Plattform eigentlich nur die Eclipse-Plugins reinkommen sollen, und sämtliche Plug-Ins von Drittanbietern in einem eigenen Bundle im Projekt zusammengestellt werden.

Mit dem normalen Spring (nicht DM) konnte ich mir also einfach ein neues Plug-In erstellen, und dort die 3 jar Dateien ins lib Verzeichnis kopieren.

Bei Spring DM ist das jedoch alles ein wenig anders, da es sich bei den .jar Dateien um Plug-Ins handelt, und ich diese nicht in einem Plug-In bündeln kann (falls doch bitte verbessern).

Leider habe ich dann an die 7-10 Spring Plug-Ins in meinem Projekt, was ich relativ unschön finde. Falls also jemand eine Variante kennt, mit der ich die Plug-Ins in einem Bundle importieren kann, wäre es nett wenn er sich melden könnte.


----------



## Gast2 (22. Feb 2010)

quiddix hat gesagt.:


> Hi,
> 
> habe diese Tutorials auch schon gefunden. Leider kann/darf ich die Target-Pattform nicht erweitern (Projektspezifische Vorgaben).
> 
> Ich habe auch gelesen, dass in die Target-Plattform eigentlich nur die Eclipse-Plugins reinkommen sollen, und sämtliche Plug-Ins von Drittanbietern in einem eigenen Bundle im Projekt zusammengestellt werden.



Target Platform in eclipse erweitern, weißt du wie das geht???
Dazu musst du NICHT den eclipse Ordner ändern, da sollten nur elcipse Plugins rein. In die Target  Platform kommen natürlich noch andere Plugins rein... Man baut sich bei den meisten Anwendungen eine Target Platform aus mehren Ordner und Modulen zusammen.
Du musst nur ein Third Party Bundle machen, wenn diese libs keine Bundles sind warum solltest du Bundles nochmal in ein Bundle packen. Macht doch kein Sinn^^...



quiddix hat gesagt.:


> Mit dem normalen Spring (nicht DM) konnte ich mir also einfach ein neues Plug-In erstellen, und dort die 3 jar Dateien ins lib Verzeichnis kopieren.
> Bei Spring DM ist das jedoch alles ein wenig anders, da es sich bei den .jar Dateien um Plug-Ins handelt, und ich diese nicht in einem Plug-In bündeln kann (falls doch bitte verbessern).


Bei Spring handelt es sich auch um Bundles genau so wie bei Spring DM... Du brauchst kein eigenes Bundle!!!



quiddix hat gesagt.:


> Leider habe ich dann an die 7-10 Spring Plug-Ins in meinem Projekt, was ich relativ unschön finde. Falls also jemand eine Variante kennt, mit der ich die Plug-Ins in einem Bundle importieren kann, wäre es nett wenn er sich melden könnte.


Du machst dir ein feature und schreibst die Bundles rein die benötigt werden...Diese wiederum gibst du in deinem product an...


----------



## quiddix (23. Feb 2010)

Hi,

ok dann nehmen wir einmal an ich will die Target Platform erweitern. Prinzipiell könnte ich dann doch einfach die Ordner "dist" vom Ordner "spring-osgi-2.0.0.M1-with-dependencies" hinzufügen.

Muss ich zusätzlich den Ordner "dist" vom normalen Spring-Framework zur Target-Plattform hinzufügen, also "spring-framework-3.0.1.RELEASE-A-with-docs/dist" ?

Irgendwie vergessen alle tutorials diesen schritt, bzw. basteln sich irgendwas mit maven zusammen. Bei dem von dir verlinkten Tutorial von Ralf Ebert steht, dass man einfach die Bundles zur Target-Platform hinzufügen soll.

Wäre nett wenn mir da jemand Hilfe geben könnte


----------



## Gast2 (23. Feb 2010)

Ja wie man die Target Platform erweitert hat ja auch nichts mit Spring zu tun.
Du gehst unter Window/Preferences/Plugin - In Development/Target Platform und dann auf Edit ... Jetzt kannst du deiner Target Platform neue Bundles hinzufügen... Einfach mit add und Ordner angeben wo sie drin liegen.


----------



## quiddix (24. Feb 2010)

Hi,

also ich habe die Bundles nun importiert. Kann nun mein Programm starten und sehe an der consolen-Ausgabe, dass der extender anläuft.

Leider kommt beim einlesen meiner "*.xml" Datei ein Fehler.

Log:





> 24.02.2010 13:57:54 org.springframework.osgi.extender.internal.boot.ChainActivator <init>
> INFO: Blueprint API detected; enabling Blueprint Container functionality
> 24.02.2010 13:57:54 org.springframework.osgi.extender.internal.activator.ContextLoaderListener start
> INFO: Starting [org.springframework.osgi.extender] bundle v.[2.0.0.M1]
> ...



@SirWayne
Du hattest doch eine ähnliche Fehlermeldung mit Hibernate. Hast du eine Idee oder eine Lösung an was das liegen könnte?

Meine .xml Datei
[XML]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="test" class="testing.MyModel"></bean>
</beans>
[/XML]

Wäre für Hilfe dankbar.


----------



## Noctarius (24. Feb 2010)

Dann fehlt dir eine Abhängigkeit wo die Klasse drin ist.

JAR's kannst du bei Jarfinder.com nachschauen (jars containing the class org.springframework.asm.ClassVisitor)


----------



## quiddix (24. Feb 2010)

Wenn ich dich richtig erstehe meinst du, dass mir eine Abhängigkeit zu org.springframework.asm fehlt?

Normalerweise müsste mir das doch bei der Run Configuration angezeigt werden, wenn ich auf "validate Plug-Ins" dürcke.

Da prüft er alle Abhängigkeiten von den verwendeten Plug-ins und sagt mir, falls eine Plug-In fehlt.

Da mir das org.springframework.asm packet nicht als Abhängigkeit angezeigt wurde, hatte ich es auch nicht als Bundle importiert. Aber auch wenn ich es importiere, bleibt die Fehlermeldung gleich

EDIT: Ich habe nun alle Plug-Ins vom "lib" Ordner importiert und langsam ein paar gelöscht

Mit folgenden Plug-Ins funktioniert nur das laden der XML-Datei.
Falls da noch überflüssige dabei sind, die jemand erkennt, wäre es nett wenn er sich melden könnte:
-com.springsource.org.apache.commons.loggin_1.1.1.jar
-spring-osgi-core.2.0.0.M1.jar
-spring-osgi-extender-2.0.0.M1.jar
-spring-osgi-io-2.0.0M1.jar
-com.springsource.org.aopalliance-1.0.0.jar
-com.springsource.org.objetweb.asm-2.2.3.jar
-org.springframework.aop-3.0.0.RC1.jar
-org.springframework.asm-3.0.0.RC1.jar
-org.springframework.beans-3.0.0.RC.jar
-org.springframework.context-3.0.0.RC1.jar
-org.springframework.context.support-3.0.0.RC1.jar
-org.springframework.core-3.0.0.RC1.jar
-org.springframework.expression-3.0.0.RC1.jar


----------



## Noctarius (24. Feb 2010)

Naja diese Abhängigkeit wird aber erst zur Laufzeit benötigt und eben nur in gewissen Fällen.

Aber da du org.springframework.asm dabei hast wundert es mich auch, dass er die Klasse nicht finden kann.


----------



## quiddix (24. Feb 2010)

Wie ich im editierten Post eigentlich schon geschrieben habe, funktioniert das laden der .xml Datei nun.
Wahrscheinlich haben einfach noch mehr Plug-Ins gehfehlt.

Mit der genannten Auflistung läd nun die .xml Datei


----------



## Noctarius (24. Feb 2010)

Alles klar


----------



## quiddix (24. Feb 2010)

Nun wollte ich beginnen meine Business-Logik zu implementieren.
Da wir ein anderes Projekt habe, an dem ich mich orientieren soll, habe ich mir zunächst den Quellcode angesehen. Dieses Projekt benutzt normales Spring in der Version 2.5 (also nicht wie ich Spring 3.0.1 mit Spring DM 2.0.0).

Prinzipiell würde ich gerne eine BlServiceRegistry-Klasse erstellen, die alle Services die die BL anbietet als Attribute hat und passende set Methoden zur DI anbietet. 
In dem alten Projekt ist es wie in diesem Tutorial umgesetzt worden : 
Beispiel für Springframework / Hibernate / Equinox / OSGi / Eclipse / ExtensionPoints - Java @ tutorials.de: Forum & Hilfe

Beim Start des Businesslogik Bundles wird manuell das "BlServieRegistry" Bean geholt um die Initialisierung der Attribute durch Spring anzustoßen. Danach kann die BlServiceRegistry (Singleton) und alle Attribute genutzt werden um verschiedenste, selbst implementierte Services zu nutzten (z.B. bestimmte Daten von der DB holen ...).

Nun wollte ich fragen ob jemand Beispiele kennt, oder weiß wie man das mit dem Anstoßen der Initialisierung für die BlServiceRegistry macht? Ist die im Tutorial genannte Variante noch gut, oder gibt es mittlerweile bessere Möglichkeiten.

Danke


----------



## quiddix (25. Feb 2010)

Ich habe mir nun testweise eine BLServiceRegistry Klasse (singleton) erstellt.

Die Klasse hat einen Service "TestService", der wiederum die Methode test() hat, die eine Textnachricht auf der Konsole ausgibt.

Schreibe ich nun meine Spring-XML-Dateien, so wird alles richtig initialisiert. Will ich jedoch die Methode in einer View in der GUI aufrufen


```
BlServiceRegistry serviceRegistry = BlServiceRegistry.getInstance();
		IBLTestService testService = serviceRegistry.getTestService();
		testService.test();
```

dann kommt eine Null-Pointer-Exceltion.

Zum Zeitpunkt, an dem die createPartControl() Methode der GUI aufgerufen wird, hat Spring DM noch nicht alle .xml Dateien eingelesen und initialisiert. Deshalb kommt bei "serviceRegistry.getTestService()" null zurück.

Hat jemand eine Idee wie ich dieses Problem lösen kann? Ich habe mir schon überlegt, dass das mit Start-Levels funktionieren könnte, hatte jedoch bis jetzt keinen Erfolg. Da das wohl fast jeden betreffen wird, der Spring DM einsetzt, hoffe ich dass ich hier eine Antwort erhalte.

MFG QX


----------

