JBoss EJB 3.0 mit Eclipse RCP nutzen
- Am 29. Juli 2006
- Von jmc
- In Eclipse IDE, EJB 3.0, Java, JBoss
5
Als ich neulich das erste Mal aus einer Eclipse RCP heraus auf JBoss zugreifen wollte, bekam ich gleich die unschönen Seiten des OSGI-Classloading zu spüren. Meine Suche im Web nach einer Lösung förderte eigentlich nur die Fragen von anderen zu diesem Thema zu Tage. Daher nun hier mein Versuch, ein kleines Howto zu schreiben damit andere schneller zu einem funktionierendem Ergebnis kommen.
Das Ziel
Ziel soll sein, ein Eclipse Rich Client Project (ab jetzt nur noch RCP) zu erstellen, dass aus dem eigentlichen RCP-Plugin und einem Plugin mit den JBoss-Client-Bibliotheken besteht. Die EJB-Klassen werden wir in diesem Fall erstmal direkt in das RCP-Plugin integrieren, in einem späteren Beitrag werden sie dann, zwecks besserer Wartbarkeit, in ein eigenes Plugin ausgelagert. Die Anwendung soll dann ihre Daten als Session- und Entity-Beans vom JBoss beziehen.
Das Problem
Der OSGI-Classloader von Eclipse erzeugt für jedes geladene Plugin einen eigenen Classpath. Die Klassen von anderen Plugins sind dadurch unsichtbar. Dieses Vorgehen ist auch sinnvoll, denn es ermöglicht unter anderem das (de-) aktivieren von Plugins zur Laufzeit der Anwendung. Sofern ein Plugin (nennen wir es A) sich als Abhängig von einem anderen Plugin (B) erklärt (unter Dependencies im Plugin-Editor) werden die Klassen von B für A sichtbar.
In unserem Falle benötigen wir aber eine beidseitige Sichtbarkeit. Unser RCP muss die JBoss-Klassen sehen und JBoss muss die im RCP vorhandenen EJB-Klassen sehen können. Ist dies nicht gegeben hagelt es
javax.naming.CommunicationException [Root exception is java.lang.ClassNotFoundException: bz.jmc.blog.tutorial.rcp_with_jboss.ejb.MyTestStatelessSessionRemote (no security manager: RMI class loader disabled)]
und ähnliche Fehler.
Die Lösung
Da nicht beide Plugins sich gegenseitig unter Dependencies angeben können benötigen wir eine andere Lösung. Die heisst für uns “Buddy Classloading”. Hiermit wird es möglich, dass sich ein Plugin schon während der Implementierung für die Klassen von anderen Plugins “öffnet”. Andere Plugins können sich so als Buddy registrieren und Ihre Klassen dem anderen Plugin zur Verfügung stellen.
Auf den folgenden Seiten habe ich ein kleines, mit Screenshots versehenes Tutorial zusammengestellt, dass die Lösung anhand eines einfachen Beispiels erläutert.




Martin
Gute Zusammenfassung!
Aber fast 20MB an jars? Das jbossall-client.jar müsste ausreichend sein. Ich hab eine etwas andere Aufteilung der Plugins, daher bin ich mir nicht ganz sicher. Bei mir funktionierts aber so.
jmc
Hi Martin!
Vielen Dank! Bezüglich der ganzen Jars hast Du sicher Recht. Ich habe seinerzeit auch versucht mit weniger auszukommen. Dabei traten allerdings ständig irgendwelche ClassCastExceptions oder ClassNotFoundExceptions auf. Darum habe ich einfach wieder alle reingenommen.
Sollte ich mal Zeit haben werde ich ausprobieren, welche man gefahrlos weglassen kann.
JMCblog
Using JBoss EJB 3 with Eclipse RCP [Part 1]…
I got a lot of hits to my article about how to connect an Eclipse Rich Client Project to JBoss and EJB 3. Most of these hits came from people outside of germany and left right after entering the page. So I think that there is some interest in an englis…
Gerhard
Dein Artikel hat mir sehr geholfen!
Ich habe lange gesucht. Das hier war die erste funktionierende, verständliche, komplette Beschreibung.
Hier meine Anmerkungen:
a) org.jboss.client
Es sollten folgende JAR’s ausreichen:
- jbossall-client.jar
- jboss-j2ee.jar
- jnp-client.jar
- log4j.jar
b) SecurityManager
Im Clientcode fehlt ein security manager.
c) ejb.jar
Kennst Du einen Eclipseservice, der das EJB-Archiv automatisch zusammenpackt und an die richtige Stelle kopiert? Für den Applicationserver macht Eclipse das auch. Kann man sich an dieser Stelle einhängen?
jmc
Hallo Gerhard!
Vielen Dank für Dein Lob, es freut mich das ich Dir mit dem Beitrag helfen konnte.
Zu Deinem Punkt “c” habe ich noch eine Frage: Mit welchem Service von Eclipse packst Du das JAR / EAR zusammen und kopierst es auch in den JBoss?
Ich muss das immer in zwei Schritten machen: “Run packaging” und anschliessend im Server-View noch den Button “Publish to Server” anklicken.
Geht das auch eleganter?
Gruß,
Jens