Muster-Web-Applikation für SWP I mittels AppFuse

(C) 2009-05-12 Christoph Knabe

AppFuse ist ein Startpunkt zum Entwickeln von geschichteten Web-Applikationen in Java mittels Spring 2.5 als Dependency Injection Container und einer Reihe von auswählbaren Oberflächen- und Persistenz-Rahmenwerken. Hier stelle ich eine von mir verifizierte Variante für das Oberflächen-Rahmenwerk Spring MVC und das Persistenz-Rahmenwerk Hibernate 3 unter Benutzung des Build-Werkzeugs Maven 2 vor.

Vorgegangen wurde nach http://appfuse.org/display/APF/AppFuse+QuickStart. Einzelne Abweichungen werden hier beschrieben und begründet.

  1. Installation eines aktuellen JDK ab Version 5. Die Umgebungsvariable JAVA_HOME muss auf das JDK, nicht auf das JRE zeigen!
  2. Die Installation von MySQL und einem Mailserver wurde weggelassen. Für einen schnellen Erfolg ist die eingebettete Datenbank H2 sinnvoller. Nach ersten Erfahrungen kann die Installation von MySQL oder PostgreSQL nachgeholt werden. H2 legt seine Daten in dem durch die Java System Property "java.io.tmpdir" bestimmten Verzeichnis ab. Anscheinend verträgt H2 keine Backslashs in diesem Verzeichnisnamen. Daher muss diese System Property Unix-kompatibel gesetzt werden. Siehe unten.
  3. Download und Installation von Maven ab Version 2 siehe: http://maven.apache.org/download.html
    Dies bedeutet auch, die Umgebungsvariablen M2 und M2_HOME zu setzen.

    Maven 2 legt bei der ersten Benutzung ein lokales Repository im Home-Verzeichnis des Benutzers an. Bei mir auf Windows XP liegt dieses im Verzeichnis
    C:/Dokumente und Einstellungen/knabe/.m2/repository
    Das durch Maven hier mitbenutzte Tool ANT 1.7.0 verträgt keine Zwischenräume im Verzeichnisnamen. Daher muss auch die System Property "user.home" Unix-kompatibel gesetzt werden (siehe unten).

    Im Repository werden die Dateien für eine Gruppe org.g1.g2 für das Artefakt a für die Versionsvariante m.n-v abgelegt im Verzeichnis org/g1/g2/a/m.n-v/ Die Dateien heißen a-m.n-v.jar und a-m.n-v-sources.jar und so weiter.

  4. Umgehung der Windows-Inkompatibilitäten bei H2 und ANT:
    Unter Systemsteuerung > System > Umgebungsvariablen > Benutzervariablen die Variable MAVEN_OPTS mit dem Wert -Djava.io.tmpdir=D:/tmp -Duser.home=C:/DOKUME~1/knabe definieren.
    Dabei muss das Verzeichnis D:/tmp für temporäre Dateien (u.a. die von H2) existieren. DOKUME~1 ist der DOS-Aliasname von Dokumente und Einstellungen. (Wenn weitere mit Dokume beginnende Verzeichnisse oder Dateien in C:\ stehen, kann der Aliasname auch DOKUME~2 oder ähnlich lauten.) Bitte überprüfen Sie, dass dieser tatsächlich auf das Verzeichnis Dokumente und Einstellungen zeigt. knabe ist durch Ihren Benutzernamen zu ersetzen.
    Auf Unix-Systemen sind diese Hilfestellungen für das System nicht nötig.
  5. Erzeugen eines Verzeichnisses swp-appfuse und cd hinein.
  6. Ausführen des Maven-Archetyp-Kommandos für Variante Struts 2 Basic (oder eine andere, dann selbst probieren):
    mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=de.beuth_hochschule.knabe.swp09 -DartifactId=myproject
    Dies erzeugt ein Unterverzeichnis myproject. Dorthinein mit cd wechseln.
  7. Angaben für alle folgenden Maven-Kommandos:
    1. Benutzung der einfachen Arbeitsspeicher-Java-Datenbank H2 statt MySQL: -Ph2 (Im Produktionsbetrieb sollte man auf ein ausgewachsenes Datenbanksystem wie PostgreSQL oder MySQL umstellen.)
    2. Stack-Trace-Ausgabe im Fehlerfall: -e
  8. AppFuse vom "embedded mode" zu full-source mode umstellen:
    mvn -e -Ph2 appfuse:full-source
    Muss zu Ende gehen mit der Meldung "BUILD SUCCESSFUL".
    Es entsteht ein Unterverzeichnis src/de/beuth_hochschule/knabe/swp09 und darin die Paketverzeichnisse util, model, dao, service, webapp, die den einzelnen Schichten des Muster-Softwaresystems entsprechen.
  9. Download der Libraries mit Quelltexten und Export als Eclipse-Project:
    mvn -e -Ph2 eclipse:eclipse
    Muss enden mit der Meldung "BUILD SUCCESSFUL". Generiert die Dateien .project und .classpath für Eclipse. In .classpath wird jede durch Maven verwaltete Abhängigkeit referenziert über eine Eclipse Classpath Variable M2_REPO
  10. Download der Libraries, Compile, Test:
    mvn -e -Ph2 test
    Muss zu Ende gehen mit der Meldung "BUILD SUCCESSFUL", meldet aber noch Fehler, z.B.:
    de.beuth_hochschule.knabe.swp09.service.impl.UserManagerImplTest.testGetUser()  Time elapsed: 0.016 sec  <<< FAILURE!
    java.lang.IllegalArgumentException: can only set expectations on mock objects
    	at org.jmock.internal.InvocationExpectationBuilder.captureExpectedObject(InvocationExpectationBuilder.java:67)
    	at org.jmock.internal.InvocationExpectationBuilder.of(InvocationExpectationBuilder.java:107)
    	at org.jmock.Expectations.one(Expectations.java:89)
    	at de.beuth_hochschule.knabe.swp09.service.impl.UserManagerImplTest$1.(UserManagerImplTest.java:40)
    	at de.beuth_hochschule.knabe.swp09.service.impl.UserManagerImplTest.testGetUser(UserManagerImplTest.java:39)
    
  11. Eclipse für die Verwendung von Maven konfigurieren:
    Siehe http://maven.apache.org/guides/mini/guide-ide-eclipse.html
    Mittels Window > Preferences... > Java > Build Path > Classpath Variables > New... eine Variable mit dem Namen M2_REPO und dem Path zum eigenen, lokalen Maven-Repository (s.o.) definieren. Diese gilt dann für alle Projekte im Eclipse-Workspace.
  12. Ausführen der Testsuite in Eclipse:
    Das Projekt nach Eclipse importieren mit New > Java Project > Create project from existing source.
    Dann das Verzeichnis myproject auswählen, in dem .project und .classpath stehen.
    Dann im Navigator das Projekt markieren und mit MausRechts wählen: Run as > JUnit Test.
    Muss erfolgreich durchlaufen.
  13. Start der Web-Applikation im WebServer Jetty für Testzwecke:
    mvn -e -Ph2 jetty:run
    Beendigung später mit <Strg/C>!
    (Im Produktionsbetrieb sollte man einen echten WebServer wie Tomcat benutzen.)
  14. Testbenutzung von AppFuse:
    Lesen der Seite http://localhost:8080 mit einem Web Browser.
    Anmelden mit Benutzername user, Passwort user, oder selbst einen neuen Benutzer erstellen.
    Ändern am eigenen Benutzerprofil.
    Hochladen einer Datei.
  15. Generierung einer Projektdokumentation als Website: mvn -e -Ph2 site:site
    Browsen der Datei myproject\target\site\index.html
  16. Bewertung:
    Die Kombination Maven + Spring ist unheimlich leistungsfähig, bedarf leider aber einer recht aufwändigen Einarbeitung.