Installation Beispielanwendung "Cookbook"

Beiträge zur Dokumentation von Cameleon OSP

Diese Beispielinstallation basiert auf den Produkten "SuSE Linux" Version 7.2, "Apache Tomcat" in der Version 4.01, "MySQL" in der Version 3.23.37 und dem Java-Standard-Development-Kit (JSDK) in der Version 1.3.1_02. Es wird davon ausgegangen, dass diese Komponenten auf dem Linux-System installiert und jedes für sich lauffähig ist. Es wird ausserdem angenommen, dass der Tomcat-Server auf Port 8080 läuft. Falls Sie Probleme haben diese einzelnen Komponenten zum Laufen zu bringen, empfehle ich das Troubleshooting, welches Sie am Ende dieser Seite finden.
 
 
Tomcat

Tomcat benötigt zum Start die Informationen zur installierten JSDK (JAVA_HOME). Außerdem benötigt "Tomcat" die Pfadinformation zu den Laufzeitbibliotheken des JSDK (CLASSPATH). Auch sollte der Pfad zum "bin"-Verzeichnis des JSDK "Tomcat" bekannt gemacht werden, da "Tomcat" sozusagen "on the fly" kompiliert und dies natürlich nur dann funktioniert, wenn die Pfad korrekt gesetzt sind. Ich habe es mir hier einfach gemacht, indem ich ein Startskript namens "tomcat" erstellt habe, welches alle diese Informationen enthält. Über dieses Skript kann ich dann den "Tomcat" starten indem ich einfach "tomcat start" aufrufe und beenden indem ich einfach "tomcat stop" aufrufe. Bitte versäumen Sie nicht dieses Startskript bspw. mit "chmod 755 tomcat" ausführbar zu machen! Damit es schon beim Systemstart gestartet wird, empfiehlt es sich dieses Skript der SuSE-Analogie zu folge nach "/etc/init.d" zu kopieren und dann einen entsprechenden Soft-Link in den Runlevel-Verzeichnissen "/etc/init.d/rc?.d" zu erstellen. Angenommen Sie verwenden den Default-Runlevel 31 (Full multiuser with network), dann können sie mit dem folgenden Befehl einen solchen Soft-Link erzeugen:

ln -s /etc/init.d/tomcat /etc/init.d/rc3.d/S99tomcat
ln -s /etc/init.d/tomcat /etc/init.d/rc3.d/K11tomcat

Der Soft-Link mit dem Namen S99tomcat veranlaßt SuSE dazu, bei Systemstart das Startskript "tomcat" ganz am Schluss auszuführen, nachdem alle anderen Prozesse gestartet sind. Der Soft-Link mit dem Namen "K11tomcat" bewirkt, dass "Tomcat" nach den Prozessen mit der Nummer "K10..." und vor denen mit "K12..."gestoppt wird. Ich habe deshalb "K11tomcat" gewählt, damit "Tomcat" vor "MySQL" (standardmäßig "K12mysql") beendet wird. Das ist sinnvoll, denn es wäre fatal, wenn im Falle eines Systemstopps die Anwendung die unter "Tomcat" läuft im Netz noch angeboten wird und funktioniert, während die Datenbank bereits beendet wurde. Hier nun der Inhalt des Skripts "/etc/init.d/tomcat"

#! /bin/sh
export JAVA_HOME=/usr/lib/jdk1.3.1_02
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export CATALINA_HOME=/opt/tomcat
export PATH=$JAVA_HOME/bin:$PATH

case "$1" in
start)
/opt/tomcat/bin/startup.sh
;;
stop)
/opt/tomcat/bin/shutdown.sh
;;
esac
 

Wie Sie aus dem Skript ersehen können, liegt bei meinem System das "JSDK" unter "/usr/lib/jdk1.3.1_02" und "Tomcat" unter "/opt/tomcat". Im weiteren Verlauf der Beispielinstallation wird davon ausgegangen, dass dies so ist. Falls nicht, müssen Sie anstelle dieser Verzeichnisse Ihre Verzeichnisse angeben.
Alternativ können Sie die "export"-Anweisungen auch in die Datei "/etc/profile" kopieren, so dass die Variablen beim nächsten Systemstart automatisch gesetzt werden. Wenn Sie die Variablen nur für sich selbst setzen wollen, so können Sie diese "export"-Anweisungen auch in die Datei "/home/ihrname/.bash_login" aufnehmen und sich dann neu anmelden.

Folgende Verzeichnisstruktur werden Sie bei "Tomcat" unterhalb von CATALINA_HOME vorfinden:

bin
classes
common
conf
lib
logs
server
webapps
work

Wichtig im Zusammenhang mit der Installation des Frameworks sind die Verzeichnisse "common", "lib" und "webapps". Die Verzeichnisse "work" und "logs" sind interessant bei der Fehlersuche. In das Verzeichnis "common/classes" kommen alle ungepackte Klassen die allen Applikationen zur Verfügung gestellt werden sollen. In das Verzeichnis "common/lib" kommen alle gepackten "jar"-Dateien die allen Applikationen zur Verfügung stehen sollen. Kopieren Sie also hier den "JDBC"-Treiber2 für "MySQL" hinein, damit er von allen Ihren Anwendungen gefunden werden kann. Hier hinein sollten Sie auch die vom Framework mitgelieferte Klassenbibliothek "must.jar" kopieren, damit alle Anwendungen die mit dem Framework erstellt werden die benötigten Klassen finden können. "Tomcat" bindet beim Start alle diese Bibliotheken ein, so dass auf die darin enthaltenen Verzeichnisstrukturen ohne weiteres Zutun zugegriffen werden kann. Machen Sie dies also zuerst, denn sonst wird alles Weitere nicht funktionieren.

Falls Sie aus Ihren Anwendungen "jar"-Dateien machen, so sollten Sie diese nach "lib" kopieren. Auch hier ist es so, dass die darin liegenden Verzeichnisstrukturen von "Tomcat" automatisch eingebunden werden. Nehmen wir also an, dass Sie "cookbook.jar" erzeugt haben und dieses nun unter "Tomcat" laufen lassen wollen, dann kopieren Sie diese Datei einfach nach "lib", stoppen und starten "Tomcat" neu und schon müsste es funktionieren. "jar"-Dateien für Ihre Anwendungen sollten Sie jedoch nur verwenden, wenn das Produkt fertiggestellt ist, denn damit "Tomcat" diese Dateien erkennt, muss "Tomcat" beendet und wieder gestartet werden. Während der Entwicklung ist es besser die Klassen ungepackt unterhalb des "webapps"-Verzeichnisses abzulegen. Dies benötigen Sie auch insbesondere dann, wenn Sie nicht nur Klassen, sondern auch JSP-Dateien und andere Resourcen in Ihrer Anwendung verwenden. Dies hat u.a. den Vorteil, dass Sie "Tomcat" mit dem "Tomcat-Manager" dazu veranlassen können geänderte Klassen zur Laufzeit neu zu lesen. Ein "shutdown" des "Tomcat" ist damit nicht mehr nötig, das heißt andere Anwendungen können weiter laufen. Sie sollten dieser Variante also den Vorzug geben, wenn Sie im Produktiveinsatz sind. Im nächsten Abschnitt erkläre ich deshalb die Installation der Demoanwendung "cookbook" unterhalb von "webapps". Erzeugen Sie also zuerst folgende Verzeichnisstruktur unterhalb von "webapps":

cookbook
cookbook/WEB-INF (bitte beachten Sie die Grossschreibung von WEB-INF!)
cookbook/WEB-INF/classes
cookbook/jsp (hierhin kopieren Sie die Java-Server-Pages *.jsp)
cookbook/help (hier hinein die Dateien Logo.gif, cbprop.html, indtextb.jpg)
cookbook/help/english (hier hinein die englischen Hilfedateien wie z.B. Operate.htm etc.)
cookbook/help/german (hier hinein die deutschen Hilfedateien wie z.B. Operate.htm etc.)
cookbook/images (hier hinein close.jpg, enq.jpg, menu.jpg, new.jpg, type.jpg)
cookbook/stylesheets (hier hinein default.css, list.css, menu.css)

Als nächstes kopieren Sie bitte die gesamte Verzeichnisstruktur von "cookbook" in das Verzeichnis "cookbook/WEB-INF/classes", so dass die Java-Sourcecodes in folgendem Verzeichnis liegen:

cookbook/WEB-INF/classes/de/jugs/cookbook

Als letztes kopieren Sie bitte die Datei "must.html" nach "webapps".
 
 
MySQL

Das Hauptproblem bei das im Zusammenhang mit "MySQL" auftauchen kann ist das Problem der Zugriffsberechtigung. Damit die Anwendung "cookbook" über den JDBC-Treiber auf "MySQL" zugreifen kann, ist es notwendig einen Benutzer einzurichten. Standardmäßig wird der Benutzer "cook" verwendet. Wenn "Tomcat" und damit die Anwendung "cookbook" und "MySQL" auf einem Rechner laufen (was wohl in den meisten Fällen der Fall sein wird), dann greift die Anwendung über den Host "localhost" auf die Datenbank zu. Unter "MySQL" sieht der Benutzer dann in etwa so aus: cook@localhost. Einen solchen Benutzer richten wir mit dem MySQL-Datenbank-Tool "mysql" mit folgendem Kommando ein:

use mysql;
insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv) values ('localhost','cook','password('pwd1'),'Y','Y','Y','Y');

Anschließend sorgen wir dafür, dass "MySQL" die Benutzertabelle neu einliest indem wir das Kommando "mysqladmin reload" absetzen. Erst danach ist garantiert, dass der Benutzer "cookbook" von "MySQL" die Erlaubnis erhält auf die Datenbanktabellen zuzugreifen.

Die Anwendung "cookbook" benötigt, ausser den eigentlichen Tabellen die mit der Datenhaltung zu tun haben, noch zwei weitere die zum Einen für die Benutzerverwaltung (Tabelle "User") und zum Anderen für die Führung des Primärschlüssels (Tabelle "Identity") zuständig sind. Um das Anlegen dieser Tabellen zu vereinfachen, bringt "cookbook" eine Datei namens "createDB.sql" mit. Diese Datei enthält alle zum Anlegen und Füllen der Datenbank bzw. Tabellen erforderlichen SQL-Anweisungen. Übergeben Sie diese Datei an das Datenbank-Tool "mysql", so dass die SQL-Anweisungen ausgeführt werden:

mysql < createDB.sql

Versuchen Sie jetzt sich bei MySQL als User "cook" und Passwort "pwd1" anzumelden.

mysql -ppwd1 -u cook cookbook

Wenn das klappt und Sie den Prompt (mysql>) von MySQL bekommen, dann ist es in Ordnung. Falls nicht, so schauen Sie sich einmal mit "tail" die Logdatei von MySQL an. Diese finden Sie aller Wahrscheinlichkeit nach unter dem Namen "/var/lib/mysql/rechnername.log". Probleme mit MySQL sind dort am ehesten zu erkennen. Sollte eine solche Datei nicht existieren, dann haben Sie "MySQL" nicht im Log-Modus gestartet. Ziehen Sie in diesem Fall die Dokumentation von "MySQL" zu rate.
 
Der grosse Augenblick

Nun starten wir die Anwendung "cookbook". Starten Sie dazu unter Linux Ihre grafische Oberfläche und Ihren Lieblingsbrowser. Geben Sie folgende URL ein:

http://localhost:8080/cookbook/servlet/de.jugs.cookbook.Main

Nun sollten Sie nach einem kurzen Augenblick die Eingangsseite der Anwendung "cookbook" sehen. Falls nicht, so hilft Ihnen vielleicht das Troubleshooting. Falls Sie von einem entfernten Rechner aus auf den Tomcat-Server zugreifen wollen, dann gilt natürlich nicht "localhost", sondern dann muss hier der Name bzw. die IP-Adresse des Tomcat-Servers stehen.
 
Troubleshooting

Frage: Beim Aufruf von "Main" kommt es zu der Fehlermeldung "java.lang.NullPointerException at de.must.markup.MainStd.createConnection(MainStd.java:202)"
Antwort: Aller Wahrscheinlichkeit nach ist es dem Benutzer, welcher über den JDBC-Treiber versucht auf die Datenbanktabellen zuzugreifen, nicht gestattet diese zu öffnen. Bitte überprüfen Sie, ob die Einstellungen in "Global.java" mit denen in der Tabelle "User" der Datenbank "mysql" übereinstimmen.
oder
Antwort: Eventuell haben Sie den JDBC-Treiber nicht installiert, oder es ist der Falsche. Installieren Sie Ihn wie oben angeführt.

Frage: Trotz mehrfacher fehlerfreier Kompilierung der Java-Klassen kommt es trotzdem immer zu Java-Fehlermeldungen aus denen ich aber nicht schlau werde. Ich habe auch schon den Tomcat neu gestartet, auch das half nichts.
Antwort: Wenn alles nichts hilft, dann löschen Sie alle Dateien Ihrer Anwendung unterhalb von "/opt/tomcat/work/localhost/anwendung".

Frage: Das Verzeichnis "/opt/tomcat" gibt es bei mir nicht. Ich kann diese Anleitung nicht nachvollziehen.
Antwort: Wahrscheinlich ist bei Ihnen der "Apache Tomcat Applikationsserver" unter einem anderen Verzeichnis abgelegt – evtl. "jakarta". In diesem Fall müssen Sie diese Anleitung entsprechend abändern, oder aber einen Softlink namens "tomcat" auf das Verzeichnis "jakarta" erzeugen.

Frage: Beim Start des "Tomcat" kommt es zu Fehlermeldungen.
Antwort: Bitte überprüfen Sie, ob die Umgebungsvariablen wie o.a. auch korrekt gesetzt sind. Geben Sie folgende Kommandos ein:
echo $CATALINA_HOME
echo $JAVA_HOME
echo $CLASSPATH
echo $PATH
Bekommen Sie immer eine Ausgaben? Ist diese richtig? Falls nein, dann sollten Sie nochmals überprüfen, ob die "export"-Anweisungen wie oben angeführt korrekt eingetragen sind.

Frage: Wenn ich die Hilfedatei von "cookbook" aufrufe, fehlen die Images.
Antwort: Mit der Beispielanwendung werden die Images aus Platzgründen nicht mitgeliefert – sie werden deshalb nicht angezeigt. Sie müssen sie sich ggf. von der Homepage http://www.must.de herunterladen.

Autor: Gunter Koch, 28.03.02


1Welchen Sie verwenden können Sie aus der Datei "/etc/inittab" herauslesen. Dort finden Sie einen Eintrag wie: "id:3:initdefault". Die Zahl hinter "id:" wäre dann der Default-Runlevel.
2Ich benutze den Treiber "mm.mysql-2.0.8-bin.jar" von Mark Matthews erhältlich über www.mysql.com