Thursday, November 02, 2006

GenericRCP 0.3.0 veröffentlicht

Seit kurzem haben wir die neueste Version des GenericRCPs veröffentlicht.

Mit der neuen Version können nun auch Hibernate JPA annotierte Klassen gelesen werden. Des weiteren haben wir die Möglichkeit der grafischen Anpassungen weiter ausgebaut.

Mehr dazu auf der offiziellen GenericRCP Homepage.

An alle AppFuser: Auch Matt Raible hat über unser Tool einen kleinen Blogbeitrag geschrieben.

XDoclet und das Äquivalent in JPA

Da nun mit Hibernate Annotations eine lauffähige Implementierung des JPA Standards verfügbar ist, wird es nun langsam Zeit, von den alten XDoclet Tags abschied zu nehmen.

 

Um den Umstieg zu erleichtern, versuchen wir hier eine Liste anzulegen, welche Annotations für welche XDoclet Tags zu verwenden sind.

@hibernate.class -> @Entity

Bsp:

@hibernate.class table="testtabelle"

wird zu

@Entity(name="testtabelle")

Dokumentation

@hibernate.property -> <Gibt es so nicht mehr>

JPA mapped automatisch alle Attribute einer Klasse, die nicht transient sind. Allerdings kann man wie immer einem Attribut noch genauere Angaben über Länge, Typ etc. mitgeben.

Bsp:

@hibernate.property column="spaltenname" length="100" not-null="true"

wird zu

@Column(name="spaltenname", nullable=false, length=100)

Domumentation

@hibernate.many-to-one -> @ManyToOne

Bsp:

@hibernate.many-to-one name="library" column="libraryId" class="org.bambo.library.model.facility.Library" not-null="true"

wird zu

@ManyToOne(optional=false)

Will man den genauen Namen der Spalte angeben, so muss man noch eine zusätzliche Annotation angeben:  @JoinColumn(name="libraryid")

Dokumentation

@hibernate.collection-one-to-many -> @OneToMany

Im Gegensatz zu XDoclet muss man bei den Annotations fast keine zusätzlichen angaben mehr machen. Wichtig is nur, dass zusätzlich zu der Annotation noch angegeben wird, welches Attribut in der Klasse der anderen Seite der Assiozation diese Collection repräsentiert. Dies geschieht durch das Annotationattribut mappedBy(<Attributname>).

Bsp:

 @hibernate.set name="shelfs" lazy="true" inverse="true"
 @hibernate.collection-key column="libraryId"
 @hibernate.collection-one-to-many class="org.bambo.library.model.facility.Shelf"

wird zu

@OneToMany(mappedBy="library")

("library", da das Attribut in der Klasse Shelf, welches mit dieser Collection korrespondiert, "library" heißt).

Dokumentation

@hibernate.collection-many-to-many -> @ManyToMany

Bsp:

 

@hibernate.set name="authors" table="book_author" lazy="true"
@hibernate.collection-key column="bookId"
@hibernate.collection-many-to-many class="org.bambo.library.model.user.Author" column="authorId"

wird zu

@ManyToMany

Verwendet man ungetypte Collections, so muss die Annotation noch um das Attribut (targetEntity=org.bambo.library.model.user.Author.class) erweitert werden.

Will man noch den genauen namen der JoinTabelle angeben, so muss man die zusätliche Annotation @JoinTable(name="authors") angeben.

Die Markierung inverse gibt es in JPA nicht mehr. Statt dessen gibt man der Annotation das Attribut (mappedBy="<Attributname der collection in der anderen Klasse>") an

Dokumentation

 

Weitere Informationen über JPA Annotations findet man auf dieser Oracle Seite und natürlich auf der

J2EE Referenz Seite

Sunday, October 29, 2006

Kostenloses EBook zum Thema Maven2

Megere bietet ein kostenloses EBook zum Thema Maven2 zum Download an. In diesem Buch findet man die wichtigsten Informationen zur Nutzung von Maven2. Hier der Link zum Download: http://www.mergere.com/m2book_download.jsp

Tuesday, October 17, 2006

Abhängigkeiten verwalten ohne Maven

Wer schon einmal mit Maven gearbeitet hat, wird feststellen, dass in manchen Fällen Abhängigkeiten viel Ärger machen können. Zur Zeit wird z.B. AppFuse auf maven umgestellt, was dazu geführt hat, dass Matt 28(!) Issues in Fremdprojekten eröffnen musste, die sich nur auf fehlerhafte pom's und deren Abhängigkeiten bezogen.

Wer also weiterhin ANT (http://ant.apache.org/) nutzen will, aber trotzdem die Vorzüge eines zentralen Library Repositories nutzen will, sollte einen Blick auf Ivy (http://www.jayasoft.org/ivy) werfen.

Ivy nutzt unter anderem die Maven Repositories, um benötigte Libs zu laden und lässt sich natlos in Ant integrieren.

Einblick in HTTPSessions

Wer einen tieferen Einblick in alle in einer J2EE Applikation aktiven Sessions haben will (Was besonders zur Entwicklungszeit eine Menge Ärger ersparen kann) , sollte einmal einen Blick auf MessAdmin werfen.

Dieses Tool kann ohne Änderung am Hauptprogramm eingesetzt werden (Wenn man von kleineren Änderungen an der web.xml + einer neuen Library mal absieht). Sobald das Tool aktiv ist, kann man sich einen Überblick über alle aktiven Sessions verschaffen und zusätzlich sich für jede einzelne Session alle dort abgelegten Daten anzeigen lassen.

Als zusätzliches Goodie kann MessAdmin an alle aktiven Sessions Nachrichten verschicken, die dann per PopUp dem User angezeigt werden. Dies ist besonders sinnvoll, wenn man Tester auf Neuinstallationen bzw. bestimmte durchzuführenden Tests hinweisen will.

Saturday, September 30, 2006

AppFuse Demo Videos

Matt Raible hat Videos auf der AppFuse Wiki Seite veröffentlicht. So kann man sich einfach einen Überblick über die verschiedenen Funktionen von AppFuse verschaffen.


Sunday, September 24, 2006

Liste mit weiteren Build Tools

Nachdem ich mich nun etwas mit anderen Build Tools auseinandergesetzt habe, bin ich auf folgenden Link gestossen: http://damagecontrol.codehaus.org/Continuous+Integration+Server+Feature+Matrix

Diese Seite enthält einen genauen Überblick über die wichtigsten Continuous Build Tools.

Monday, September 18, 2006

Kontinuierliches Builden und Testen mit Continuous Integration

Wer schon einmal an Projekten mit mehreren Programmierern gearbeitet hat, kennt die Probleme, die dadurch manchmal auftreten können. Es existieren meistens zwar genaue Regeln, was wie und wann von wem in das Repository eingecheckt werden darf, trotzdem gelangen immer wieder Codefragmente ins System, die das Programmverhalten immens stören.
Entweder lässt sich das Programm nicht mehr kompilieren, oder das Programmverhalten wird durch den neuen Code ungewollt verändert.

Um solche Fehler schneller zu finden, existieren seit geraumer Zeit sogenannte "Continuous Integration Systems", meistens Server basierte Systeme, die in regelmäßigen Zeitabständen den Code auschecken und ihn zumindest bauen, in erweiterten Systemen auch gleich die Tests ausführen und die Resultate an passenden Stellen veröffentlichen.

Die bekanntesten Vertreter dieser Systeme dürften "Anthill" und "CruiseControl" sein.
Neu in dieser Familie ist das Projekt "Continuum".

Die Installation dieses Servers ist denkbar einfach:
  1. Archivdatei downloaden
  2. Entpacken
  3. Gegebenenfalls die Ports des Servers anpassen (Diese liegen per Default auf 8080 und 8000)
  4. Server starten
  5. Administrator Kennung + Passwort vergeben.
Continuum kann out of the Box mit den SCM Systemen CVS und SVN umgehen. Ein weiterer Pluspunkt ist die Unterstützung von ANT und insbesondere von Maven1 und Maven2.
Besonders bei Maven spielt Continuum seine Stärken aus:
  • In der Maven Projekt Datei die SCM URL definieren.
  • Die Projekt Datei (bei Maven2 die pom.xml) per Uploadfunktion dem Contiuum Server bekannt geben
  • Und schon lädt der Server die aktuelle Version des Programms aus dem Repository.
Sollte ein Mavenprojekt aus mehreren Unterprojekten bestehen, so konfiguriert Continuum diese automatisch.

Per Default lädt nun der Server alle 24 Stunden die neueste Version des Programms vom Server und führt vordefinierte Taks aus. Im Falle von Mavenprojketen ist dies "clean install".
Natürlich kann man diese Liste jederzeit um eigene Targets erweitern, z.B. "clean site site:depoly", und schon kann man jederzeit den aktuellen Stand der software einsehen.

Kombiniert man sein Projekt nun noch mit Tools wie Cobertura oder Clover, so erhält man genaue Statistiken über die Testabdeckung seines Projekts.

Fazit:
Wer an großen Projekten arbeitet, sollte sich überlegen, auf Continuous Intgration Systeme zurückzugreifen. Continuum stellt die einfachste Möglichkeit bereit, ein solches System schnell und einfach zum Einsatz zu bringen.

Links:

Thursday, September 14, 2006

AppFuse: J2EE ohne Kopfschmerzen

Wer schon einmal eine Webapplikation auf der Basis von Java von Grund auf selbst erstellt hat, weiß, dass eine Menge Arbeit erledigt werden muss, bis die erste einfache Seite im Browser erscheint. Da müssen Frameworks eingebunden und konfiguriert werden, diese dann auch noch untereinander verdrahtet werden, massenweise Dokumentationen gewälzt werden, um die besten Wege herauszufinden, die einzelnen Bestandteile zu konfigurieren, build Skripte erstellt werden etc. etc.

AppFuse (Erstellt von Matt Raible) hat es sich zum Ziel gesetzt, genau diese Hürden so weit wie möglich zu beseitigen.

AppFuse stellt eine Grundapplikation zur Verfügung, die aus 3 Schichten besteht:

  1. Die Datenzugriffsschicht (DAO Layer). Diese Schicht verwendet standardmässig Hibernate, kann aber auch jederzeit auf ein Alternative
  2. Die Anwendungslogikschicht (BusiniessLogic, ManagerLayer): In dieser Schicht wird die eigentliche Geschäftslogik gebündelt. Ausserdem wird über diese Schicht das Transaktionsverhalten gesteuert.
  3. Die Webschicht (WebLayer): Als ViewFrontend wird Standardmässig Struts verwendet, es besteht aber die Möglichkeit, sehr einfach auf SpringMVC, JSF, Tapestry oder WebWork zu wechseln.
Die einzelnen Schichten und Frameworks werden mit Hilfe des Springframeworks miteinenader verbunden. Dies ermöglicht es z.B., sehr einfach AOP in seine Anwendung zu integrieren oder Remoting Technologien wie RMI, HTTPInvoker oder ähnliches einzusetzen.

Für jede dieser Schichten sind bereits Tests integriert. (AppFuse setzt stark auf testdriven Development)

Standardmäßig wird AppFuse bereits mit Klassen zur Repräsentation von Usern und Rollen ausgeliefert.

Nachdem man die Grundanwendung deployed hat, stehen einem folgende Features sofort zur Verfügung:
  1. Neue User können sich registrieren
  2. User können sich anmelden
  3. Für User mit der Administratorrechten besteht die Möglichkeit, User anzulegen, zu ändern oder zu löschen.
Das Ganze wird durch Webseiten repräsentiert, die vollständig auf XHTML und CSS Templates basieren.

AppFuse eignet sich nicht nur als QuickStart Application, auch als anschauliches Lernmaterial eignet es sich vorzüglich, da die Tutorials eine detailierte Einführung in alle in AppFuse verwendeten Breiche bereitstellt. Wer also Hibernate, Spring oder ähnliches lernen will, sollte einen kurzen Blick in AppFuse werfen.

Ein weiterer Pluspunkt ist die sehr aktive Mailingliste. Hier kann man nicht nur Fragen zu AppFuse stellen, sondern bekommt normalerweise auch Hilfe zu frameworkspezifischen Fragen. Normalerweise muss man nie länger als einen Tag auf eine Antwort warten, in den meisten Fällen erhält man die Antwort schon innerhalb einer Stunde.

Diese Usercommunity hat inzwischen auch viele Tutorials erstellt, mit deren Hilfe man sogut wie jedes in J2EE verwendete Tool in AppFuse integrieren kann. Es werden Tutorials für Axis, XFire, Lucene und Compass, EasyMock und viele Frameworks mehr angeboten.

Zur Zeit ist AppFuse mit der Version 1.9.3 verfügbar, aber Version 2.0 soll in Kürze veröffentlicht werden.

Was bleibt zu sagen: Wer sich mit dem Bereich J2EE beschäftigt, sollte einen Blick auf AppFuse werfen. Sollte jemanden AppFuse zu stark vorkonfiguriert sein, mit Equinox stellt Matt Raible eine schlank Version von AppFuse bereit.

Wehr noch mehr Gründe benötigt, findet in dem Artikel 7 simple reasons to use AppFuse mehr

Erster Blog Eintrag

Nachdem ich mich lange Zeit gegen Blogs gewehrt habe, ist es nun so weit:

Ich habe endlich auch ein eigenes Blog.

Grundsätzlich kam es zu dieser Entscheidung, da die meisten interessanten technischen Artikel zur Zeit anscheinend hauptsäachlich in Blogs veröffentlicht werden, und so wie es aussieht, auch so von der Community akzeptiert werden.
Und um mir das lästige editieren von HTML Seiten / Pflegen von Wikis zu ersparen, werde ich in Zukunft auch über dieses Blog meine Erfahrungen und Tutorials über diesen Weg veröffentlichen.

Es werden wohl hauptsächlich Artikel über das Springframework (www.springframework.org), AppFuse (appfuse.dev.java.net) und allgemein zum Thema JAVA bzw. J2EE sein.
Da deutschsprachige Einträge zu diesem Thema noch mehr oder weniger Mangelware sind, werde ich hier auch fürs erste auf Deutsch schreiben...