Web-Anwendung mit Eclipse und eigenem Dateilayout erstellen #
Bevor ich mit den "Web Standard Tools" von Eclipse gearbeitet habe, habe ich auch schon Webanwendungen erstellt. Hierbei wird einem nicht die meiste Arbeit von Eclipse abgenommen. Dennoch ist auch dieser Weg interessant, weil man so vielleicht eher sieht, was "unter der Haube" passiert. Deshalb habe ich diese Anleitung auf dieser Seite ausgelagert. Der "modernere" Weg steht nun auf der Seite WebAnwendungenMitEclipse.
Dateibaum #
Ich bin nach der Tomcat-Doku vorgegangen, die ich jedem als erste Lektüre empfehle und habe die Verzeichnisse src, docs und web angelegt. in web gibts ein Unterverzeichnis /web/WEB-INF. Web bildet später das root-Verzeichnis meiner Anwendung, in dem z.B. auch statische HTML-Seiten stehen können. WEB-INF wird vom Tomcat nicht bei Web-Anfragen ausgeliefert, sondern ist für Konfigurationsdateien reserviert. Insbesondere kommt dort die Datei web.xml hinein. Hierzu habe ich die Beispiel-Datei aus den Dokus genommen und angepasst. Hier steht eine Beschreibung aller Servlets und ein Mapping, welche URL welches Servlet aufrufen soll.
Die Servlets selber sind Java-".class"-Dateien, die zum Tomcat kopiert werden müssen. Alle Dateien, die meine Applikation betreffen, müssen allerdings in einem einzigen Dateibaum untergebracht sein, wenn Tomcat sie ausführen soll. Zur Distribution und Installation wird dieser in ein Web-Archiv gepackt (*.war) und dem Tomcat übergeben. Dies macht allerdings alles unser Ant-Skript.
Ant #
Ich benötige ein Ant-build-Skript, damit mein Projekt sauber verpackt und in den Tomcat geschoben werden kann. Dazu habe ich das recht umfangreiche, aber sehr gut dokumentierte build.xml aus der Tomcat-Doku genommen. Dieses habe ich erstmal nicht verändert (ist ggf. für den Einbau von Bibliotheken nötig). Alle Einstellungen kommen in die Datei "build.properties", die von build.xml eingelesen wird. (In Eclipse muss man übrigens einstellen, dass diese Datei mit dem "Properties Editor" geöffnet wird und nicht mit dem "build properties editor", der zwar sehr hübsch, aber für unsere Zwecke nicht der richtige ist.
Ant kann durch eine Art Plugins erweitert werden. So gibt es auch eine Bibliothek, die Ant beibringt, direkt den Tomcat zu steuern (reload etc.). Diese muss allerdings dem Ant bekannt gemacht werden. Unter Debian funktioniert das sofort und problemlos, allerdings benutzt Eclipse einen eigenen Ant, deshalb muss man in Eclipse in den Einstellungen für Ant im Classpath noch die Datei /usr/share/tomcat4/server/lib/catalina-ant.jar einfügen, damit das build.xml auch richtig funktioniert.
Es gibt nun ein build-Skript, mit dem man seine Applikation erzeugen und installieren kann. Das target install erzeugt den o.g. Dateibaum, und installiert diesen in einem laufenden Tomcat (die Applikation ist nicht dauerhaft installiert). Mit reload kann man Änderungen aktualisiert in den Tomcat schieben. Mit dist wird ein *.war-Archiv erzeugt, das man dann in ein Tomcat-Verzeichnis kopiert, um die Applikation endgültig zu installieren.
Alle diese build-Prozeduren laufen unabhängig vom build-System von Eclipse ab. Sie erzeugen die Verzeichnisse build und dist, die man mit dem Target clean selbstverständlich auch wieder löschen kann. Eclipse sollte man ggf. mitteilen, daß diese Verzeichnisse nicht ins CVS gehören. (<nowiki>"Team"/"add to .cvsignore"</nowiki>)
Ich habe mir übrigens ein paar Kopien der build-Datei gemacht, weil Eclipse sich dann zu jeder Datei ein Target merken kann, das beim Starten aufgerufen wird. So habe ich in den Favoriten der externen Tools die Targets "install" und "reload", die man am häufigsten benötigt, direkt zugänglich.
Bibliotheken benutzen #
Habe ich Bibliotheken benutzt, muss ich diese mit installieren. Das stellt auch sicher, dass die Lib immer die Version hat, die ich auch beim Entwickeln hatte. Allerdings kann es Probleme mit dem Security Manager geben, falls die Bibliothek z.B. auf Dateien oder aufs Netzwerk zugreifen will, da Tomcat-Applikationen normalerweise in einer recht restriktiven Sandbox laufen.
Um z.B. die Bibliothek "Oro" mit zu verpacken, kommt in build.properties eine Zeile mit dem Pfad:
oro.jar=/usr/share/java/oro.jar
und an zwei Stellen in build.xml muss eine Zeile eingefügt werden (ist dort gut dokumentiert), und zwar, damit der Compiler die Bibliothek findet (Wenn Ant compiliert, weiss der Compiler nichts von den Eclipse-Einstellungen für den Classpath):
<pathelement location="${oro.jar}"/>
und damit die Bibliothek in das *.war-File eingebaut wird:
<copy todir="${build.home}/WEB-INF/lib" file="${oro.jar}"/>