Artikel

 
Juni 2004 | Artikel

Verborgene Schätze

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/0573)

Überblick über Jakarta Commons, Teil 1

Text: von Torsten Curdt
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Bei Jakarta Commons handelt es sich um eines der Unterprojekte von Apache Jakarta. Es beherbergt eine Sammlung von nützlichen Bibliotheken und Komponenten, die das Leben eines Java-Programmierers erheblich erleichtern können. Für die erklärten Feinde des neu erfundenen Rades soll dieser Artikel einen kleinen Überblick über die verborgenen Apache-Schätze geben, die häufig im Glanze der großen Projekte vergessen werden. Im zweiten Teil werden ausgewählte Bibliotheken im Detail vorgestellt.

Einleitung
Wer wüsste es nicht: Eines unserer kostbarsten Güter ist sicherlich die Zeit. Völlig selbstverständlich versuchen wir sie sinnvoll zu nutzen. Spätestens jedoch, wenn diese Zeit mit Geld aufgewogen wird, stellt sich die Frage, wie weit es um diesen sinnvollen Nutzen wirklich bestellt ist. Obwohl Nutzen eine sehr subjektive Empfindung ist, gibt es dennoch einen nicht ausgesprochenen allgemeinen Konsens. Niemand wird es als wirklich sinnvoll erachten, viel Energie und Zeit zu investieren, um etwas zu erschaffen, wenn bereits etwas Vergleichbares existiert. Andernfalls muss es signifikante Gründe geben, die einen entsprechenden Aufwand rechtfertigen.

Oder würden Sie sich z.B. einen Stuhl selber schnitzen, wenn Sie einen günstig erstehen könnten? Wäre es wirklich sinnvoll, die Zeit dafür zu opfern, sich seine eigenen Stühle zu bauen? Besonders, wo ihr Bekannter doch genau so einen erstandenen Stuhl zu Hause hat und sehr zufrieden mit ihm ist. Wird er wirklich so viel schöner und besser, wenn Sie ihn in Handarbeit herstellen? Bei Software verhält es sich nicht viel anders. Das Rad neu erfinden kostet unnötige Energie.

Bei Entwicklern aus der Gemeinschaft der Apache Software Foundation kommt es nur sehr selten vor, dass sie ausschließlich an einem Projekt mitwirken und nicht über dessen Tellerrand hinaus blicken. So lässt es sich auch einfach erklären, dass den Entwicklern der bekannten Jakarta-Projekte wie z.B. Tomcat oder Struts Überschneidungen wie das Logging aufgefallen sind. Um die Energie und Arbeitskraft der Open Source-Gemeinde effizienter nutzen zu können, wurde daraufhin Jakarta Commons (häufig einfach kurz Commons genannt) gegründet. Überschneidungen der Projekte wurden ausgegliedert und in unabhängige Bibliotheken zusammengefasst. Für Commons stellt somit der Name auch gleich eines der wichtigsten Projektziele dar: das Finden und Nutzen von Gemeinsamkeiten. Obgleich die von Sun zur Verfügung gestellten Java-Standard-APIs recht umfangreich sind, können und wollen sie auch gar nicht alle Anforderungen abdecken. Somit fallen in jedem Projekt nützliche Helferklassen und sogar kleine Frameworks ab, die auch außerhalb des Projektkontextes Sinn machen können. Ein solches Sammelsurium von nützlichen Klassen lässt sich häufig auch in allgemeinere Bibliotheken zusammenfassen. Das Commons-Projekt hat sich zur Aufgabe gemacht, weitere solcher wiederverwertbaren Bibliotheken zu erschaffen und zu pflegen. Um eine Nutzung der Bibliotheken so einfach wie möglich zu halten, wird besonders großen Wert auf geringe Abhängigkeiten und einfache APIs gelegt. Generell sollen die Bibliotheken einfach out of the box funktionieren. Kleinere Ausnahmen bestätigen hier jedoch die Regel. Unabhängig davon kann man sich allerdings recht sicher sein, dass die Komponenten in Commons bereits den Produktivtest bestanden haben und schon irgendwo erfolgreich ihren Dienst tun. Ein beruhigender Aspekt bei der eigenen Projektplanung.

Jakarta Commons sollte dabei nicht mit dem Top-Level-Projekt Apache Commons verwechselt werden. Im Unterschied zu Jakarta Commons soll Apache Commons nicht ausschließlich auf Java beschränkt sein. Gemeinsamkeiten sollen über Sprachgrenzen hinaus auf funktioneller Ebene gefunden werden. Derzeit befindet sich das Projekt aber noch im Aufbau.
Die Dokumentation der Komponenten in Commons fällt zum Teil ein wenig dürftig aus und ist oft nur auf die Javadocs des API mit einigen wenigen Beispielen beschränkt. Davon sollte man sich allerdings nicht abschrecken lassen. Die einfach gehaltenen APIs ermöglichen einen schnellen Einstieg. Für eine leichtere Einführung sei aber auch auf die Fachliteratur hingewiesen.

Um als neue Bibliothek bei Commons aufgenommen zu werden, bedarf es eines offiziellen Vorschlages (Proposal) zur Aufnahme und wenigstens dreier positiver Befürworter aus der Riege der Jakarta-Entwickler. Wird die neue Komponente akzeptiert, wird sie zunächst in die Sandbox aufgenommen. Während man im Repository nur stabile Komponenten findet, handelt es sich bei der Sandbox mehr um die Spielwiese für Jakarta-Entwickler. Erst wenn die Komponenten dem Sandkasten entwachsen sind, werden sie ins Repository übernommen. Wie so häufig in der Open Source-Welt sagt dies jedoch weniger über die Qualität des Code als vielmehr über die Zusicherung eines stabilen API aus. Dieser Artikel beschränkt sich dennoch zunächst nur auf die Komponenten des Repository.

Die aktuelle Releases finden sich auf den offiziellen Apache Mirrors wie z.B. www.apache.de/. Die angegebenen Pfade sind einfach anzuhängen. Bei Bibliotheken, für die noch keine offiziellen Releases verfügbar sind, kann man entweder auf die automatischen Nightly Builds zurückgreifen oder sich direkt die aktuelle Version aus dem CVS herunterladen:
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
password: anoncvs
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout [module-name]
BeanUtils
BeanUtils erleichtern einem den Umgang mit Beans, deren Getter- und Setter-Methoden erst zur Laufzeit bekannt sind. Dies funktioniert natürlich über das Reflection und das Introspection API. Die BeanUtils kapseln diese Zugriffe und bieten eine einfachere Schnittstelle.
Release: /dist/jakarta/commons/beanutils/binaries/commons-beanutils-1.6.1.zip
Betwixt
Betwixt bietet eine einfache Möglichkeit, Beans (im Gegensatz zu Castor oder JAXB) ohne vorher festgelegtes Schema in XML zu wandeln und sie genau so wieder einzulesen. Ein ähnlicher Mechanismus zur Serialization ist nun auch im JDK 1.4 enthalten.
Release: /dist/jakarta/commons/betwixt/binaries/commons-betwixt-1.0-alpha-1.zip
CLI
CLI steht für Command Line Interface und bietet eine konsistente Möglichkeit zur Definition und Auswertung der Kommandozeilen-Parameter. Die Usage-Informationen können aus dieser Definition sogar automatisch erzeugt werden. Nie wieder eigene Command Line Parser!
Release: /dist/jakarta/commons/cli/binaries/cli-1.0.zip
Codec
Codec stellt im weitesten Sinne Funktionen zum Kodieren und Dekodieren zur Verfügung. Angefangen von der einfachen Wandlung von Binärdaten in die hexadezimale Darstellung über das bekannte Content Transfer Encoding Base64 nach RFC 2045 bis hin zu phonetischen Algorithmen. Die DigestUtils erleichtern die Benutzung von SHA und MD5. Und jeder, der Java Servlets oder JSPs programmiert, wird sich über das so genannte URL Encoding freuen.
Release: /dist/jakarta/commons/codec/binaries/commons-codec-1.2.zip
Configuration
Configuration bietet einen zentralen Mechanismus, um Konfigurationen zu aggregieren und darauf zuzugreifen. Unterstützt werden neben einfachen Property- und XML-Dateien auch JNDI Properties. Es existiert auch eine Integration mit Digester, um darüber direkt Java-Objekte zu konfigurieren.
Release: bisher nur Nightly Builds
Collections
Collections erweitert das Java Collections API von Sun um einige neue Interfaces und speziellere Implementationen. Eine vollständige Vorstellung würde einen eigenen Artikel erfordern. Exemplarisch sei jedoch die LRU Map (Last Recently Used) zur Implementation von Cache-Strukturen erwähnt. Ein weiteres Beispiel ist das neue Bag Interface. Es erweitert das ursprüngliche Collections Interface und liefert Informationen über die Anzahl der unterschiedlichen Elemente in dem Bag. Die FastArrayList, die FastHashMap und die FastTreeMap sind Implementationen, die besonders in Multi-Threaded-Umgebungen eine schnelle Alternative zu den voll synchronisierten Java Collections-Versionen bieten. Mit den Adapterklassen lässt sich eine Verbindung von Java1- und Java2-Containern herstellen. Die CollectionUtils stellen Funktionen aus der Mengenlehre für z.B. Schnittmengen und dergleichen zur Verfügung.
Release: /dist/jakarta/commons/collections/binaries/collections-3.0.zip
Daemon
Daemon stellt über einen in C geschriebenen Teil eine Schnittstelle zum Betriebssystem her, um Java-Applikationen als Daemons (Unix) bzw. Dienste (win32) laufen zu lassen.
Release: /dist/jakarta/commons/daemon/binaries/commons-daemon-1.0-Alpha.tar.gz
DBCP
DBCP basiert auf den Pool-Komponenten und bietet die Grundlage für die JDBC Connection-Pools in Tomcat und James. Je nach Framework wird der Pool entweder als JNDI oder Avalon Datasource bereitgestellt.
Release: /dist/jakarta/commons/dbcp/binaries/commons-dbcp-1.1.zip
DbUtils
DbUtils ist ein kleines Framework, um den Umgang mit JDBC noch einfacher zu gestalten. Es kümmert sich besonders um das korrekte Freigeben von Ressourcen und hilft, oft schwer aufzuspürende Connection Leaks zu vermeiden. Insgesamt hilft es, den Code schlanker und übersichtlicher zu halten.
Release: /dist/jakarta/commons/dbutils/binaries/commons-dbutils-1.0.zip
Digester
In vielen Projekten werden XML-Dateien gelesen, um die Applikationen und deren diverse Java-Objekte zu konfigurieren. Digester bietet aufgrund einer austauschbaren Pattern Matching Engine einen flexiblen Weg, um das XML auf Java-Objekte zu mappen. Findet die Engine bestimmte XML-Strukturen, werden selbst definierte Rules ausgeführt, die die Applikation konfigurieren.
Release: /dist/jakarta/commons/digester/binaries/commons-digester-1.5.zip
Discovery
Ein Interface - unterschiedliche Implementationen. Doch welche soll benutzt werden? Leider existiert hierfür keine einheitliche Lösung. Als Beispiel seien JAXP und commons-logging angeführt, die jeweils ihren eigenen Mechanismus dafür gewählt haben. Discovery versucht, einen einheitlichen Weg dafür zu finden.
Release: /dist/jakarta/commons/discovery/binaries/commons-discovery-0.2.zip
EL
EL ist ein JSP 2.0 Expression Language Interpreter. Ursprünglich aus der JSTL entstanden, bietet JSP 2.0 Expression Language die Möglichkeit, zur Laufzeit auf einfache Art und Weise Zugriff auf Daten der Applikation zu bekommen und sogar statische Methoden aufzurufen.
Release: /dist/jakarta/commons/el/binaries/commons-el-1.0.zip
FileUpload
FileUpload übernimmt die serverseitige Aufgabe bei HTTP Uploads. Gemäß dem RFC 1867-Standard werden der Request geparst und die übertragenen Dateien der Applikation zur Verfügung gestellt. Diese Komponente lässt sich sehr einfach in Servlets oder JSPs integrieren.
Release: /dist/jakarta/commons/fileupload/binaries/commons-fileupload-1.0.zip
HttpClient
Einfache HTTP Requests lassen sich natürlich auch leicht direkt erzeugen. Spätestens aber, sobald es darum geht, Authentifizierung, Cookies, Redirects und Proxy-Server zu unterstützen, sollte man auf den HttpClient zurückgreifen. Der HttpClient unterstützt Basic-, Digest- und NTLM-Authentifizierung. Für die Unterstützung von HTTPS muss die Java Extension JSSE installiert sein.
Release: /dist/jakarta/commons/httpclient/binary/commons-httpclient-2.0-final.zip
Jelly
Jelly ist eine sehr flexible Java- und XML-basierte Scripting Engine. Ihre Einsatzgebiete sind vielfältig. Ob wie im Maven-Projekt als mächtiges Frontend zu Ant oder in Testing-Frameworks wie JellyUnit. Es lässt sich aber auch sehr gut als Template-System z.B. in Cocoon einsetzen. Jelly nutzt Jexl als seine native Expression Language, bietet aber auch Möglichkeiten, andere Script-Sprachen wie JavaScript, Jython oder XPath zu benutzen. Insgesamt könnte man in Jelly auch eine äußerst flexible Version von Ant sehen. Ohne feste Tasks und mit einer besseren Unterstützung für Ausdrücke und Schleifen.
Release: /dist/java-repository/commons-jelly/distributions/commons-jelly-1.0-beta-3.zip
Jexl
Jexl ist eine Erweiterung der JSTL Expression Language. Erfahrungen und Anforderungen aus dem Velocity-Projekt, wie z.B. die Möglichkeit zum Aufruf von Methoden, wurden als Features mit aufgenommen.
Release: bisher nur Nightly Builds
JXPath
XPath ist eine vom W3C standardisierte Expression Language, um eine Auswahl von Knoten in Baumstrukturen zu beschreiben. JXPath ist ein sehr flexibler Interpreter, der es ermöglicht, XPath-Ausdrücke nicht nur auf XML-Strukturen wie DOMs, sondern auch auf JavaBeans, Maps, Servlet Contexts und Kombination davon anzuwenden. Besonders großen Sinn macht, es JXPath als Expression Language in XML-basierten Scripting-Umgebungen zum Einsatz zu bringen. Sie wird z.B. in vielen Bereichen von Cocoon eingesetzt.
Release: /dist/jakarta/commons/jxpath/binaries/commons-jxpath-1.1.zip
Lang
Lang stellt nützliche Erweiterungen zu den Kernklassen zur Verfügung. Die StringUtils bieten, was sie schon immer in der String-Klasse vermisst haben. Weiter enthält es sinnvolle Hilfsmittel für die Verwendung von Exceptions, Reflection, Serialization, System Properties und Arrays. Ein vererbbarer enum-Typ schließt die Lücke im Java-Sprachumfang und die java.util.Date-Erweiterung erleichtern den Umgang mit dem Datumstyp erheblich. Die Builder helfen bei der Konstruktion von toString()- und equals()-Methoden und bei der Erzeugung von HashCodes.
Release: /dist/jakarta/commons/lang/binaries/commons-lang-2.0.zip
Latka
Für Java-Klassen lassen sich mit JUnit Testsuiten schreiben, um eine ständige Qualitätskontrolle sicherzustellen. Latka soll diese Aufgabe für Webseiten übernehmen. Da es in der derzeitigen Version anscheinend einige Probleme gibt, sei noch Anteater als Alternative erwähnt.
Release: /dist/jakarta/commons/latka/binaries/latka-1.0-alpha1.zip
Launcher
Launcher macht Schluss mit komplizierten plattformabhängigen, unflexiblen Shell-Skripten, wenn es darum geht, eine Java-Applikationen zu starten - egal, ob es die JVM-Parameter oder System Properties anzupassen gilt.
Release: /dist/jakarta/commons/launcher/binaries/launcher-0.9.zip
Logging
Logging versucht, die vielen unterschiedlichen Logging APIs durch eine schlanke Abstraktionsschicht zu vereinen, um Abhängigkeiten zu einem bestimmten API zu vermeiden. Bei Komponenten, die Logging benutzen, lässt sich die darunter liegende Logging-Bibliothek leicht austauschen.
Release: /dist/jakarta/commons/logging/binaries/commons-logging-1.0.3.zip
Math
Zusammen mit den Erweiterungen aus der Lang-Bibliothek bietet Commons nur einfache mathematische und statistische Algorithmen. Für komplexere Problemstellungen müssen andere Komponenten hinzugezogen werden.
Release: bisher nur Nightly Builds
Modeler
Das Java Management Extensions (JMX) API erleichtert die Entwicklung von Applikationen, um Serveranwendungen zu konfigurieren und zu administrieren. Die so genannten Management Beans (MBeans) repräsentieren dabei den zu administrierenden Teil der Serverapplikation. Diese benötigen eine Menge von Metadaten über die exportierten Methoden und Attribute. Mit der Modeler-Komponente können diese relativ einfach in XML beschrieben und so zur Verfügung gestellt werden.
Release: /dist/jakarta/commons/modeler/binaries/modeler-1.1.zip
Net
Net bietet eine Protokoll-Bibliothek für die wichtigsten Internet-Protokolle. Sowohl Finger, Whois, Telnet, POP3, FTP, NNTP, SMTP und sogar Time und Echo werden unterstützt. Aber auch TFTP und die so genannten R-Kommandos (rlogin, rsh ...).
Release: /dist/jakarta/commons/net/binaries/commons-net-1.1.0.zip
Pool
Pool ist ein generisches Object Pooling API, dass schon einige austauschbare Pool-Implementationen mitbringt. Wenn es darum geht, performante Serveranwendungen zu schreiben, kommt man um eine Wiederverwertung von großen Objekten nicht vorbei. Pool bietet hierfür die Grundlage.
Release: /dist/jakarta/commons/pool/binaries/commons-pool-1.1.zip
Primitives
Primitives bietet Collection-Implementationen für die primitiven Datentypen boolean, byte, char, double, float, int, long und short. Wenn Sie sich schon einmal geärgert haben, bei einer dynamischen Collection auf die Objektdarstellung der einfachen Datentypen zurückgreifen zu müssen, dann sollten Sie sich diese Bibliothek näher anschauen. Durch die Anpassung an die einzelnen Typen sind die Implementation kleiner, schneller und ein wenig leichter in der Handhabung. Natürlich gibt es auch entsprechende Hilfsklassen, die zwischen den objektbasierten Versionen und den Primitives vermitteln.
Release: /dist/jakarta/commons/primitives/binaries/commons-primitives-1.0.zip
Validator
Immer wenn es darum geht, Benutzereingaben zu verarbeiten, gilt es, diese Daten vorher zu überprüfen. Besonders, wenn für jede Sprache unterschiedliche Regeln zu beachten sind, kann es schnell komplex werden. Auch die Fehlermeldungen müssen in der entsprechenden Sprache dargestellt werden. Validator versucht, bei der Entwicklung entsprechender Applikationen Hilfestellung zu geben.
Release: /dist/jakarta/commons/validator/binaries/commons-validator-1.0.2.zip
Fazit
Es ist auf alle Fälle lohnenswert, ein wenig Zeit zu investieren und sich einige der Bibliotheken im Detail anzuschauen. Spätestens beim nächsten Projekt kann diese Zeit durch das richtige Einsetzen der Apache Commons-Komponenten schnell wieder hereingeholt werden. Einen Überblick über all die verfügbaren Komponenten im Internet zu behalten ist schwierig und erfordert eine gründliche Recherche. Ist man auf der Suche nach der richtigen Komponente für eine bestimmte Aufgabe, sollte man vielleicht erst einmal bei Jakarta Commons vorbeischauen. Möglicherweise wird man so schneller fündig, als man denkt. Der Folgeartikel wird einige ausgewählte Komponenten anhand konkreter Beispiele näher vorstellen und einen ersten praktischen Einstieg liefern.
Links und Literatur


Anzeige

Kommentare


Anzeige

zurück zum Seitenanfang