Programmbibliotheken

Was ist eine Programmbibliothek?

Eine Programmbibliothek (eng. software library oder auch nur library) ist eine Sammlung von Klassen (bzw. auch Interfaces etc.), die dazu gedacht sind, in anderen Programmen wiederverwendet zu werden. Auf diese Weise muss ein*e Entwickler*in komplexe Konzepte nicht jedes mal neu erfinden und umsetzen, sondern kann auf vorhandene Lösungen zurückgreifen, die im besten Fall von Spezialist*innen entwickelt und von tausenden Programmierer*innen genutzt und getestet werden.

Die Java Class Library

Erinnern wir uns zur Orientierung noch einmal daran, dass wir von Anfang an bereits eine Programmbibliothek benutzen: Die Java Class Library. Sie ist Bestandteil des JDK und steht damit in jedem Java-Programm zur Verfügung. Sie umfasst zahlreiche Klassen (…), die zum Schreiben von Java-Programmen entweder grundlegend (siehe Paket java.lang in der Grafik unten) oder mit hoher Wahrscheinlichkeit nützlich sind.

Java Standard Library Diagram
Quelle: www.mathcs.emory.edu

Das Paket java.lang enthält Klassen (…), die so grundlegend für die Java-Programmierung sind, dass es automatisch zum Classpath eines Java-Programms gehört. Klassen (…) aus java.lang müssen deshalb auch nicht mit dem import statement importiert werden.

/*
* Weder für "System", noch für "Math"
* ist ein Import notwendig!
*/

System.out.println(Math.random());

Alle weiteren Bestandteile der JCL stehen nach Bedarf zur Verfügung, müssen also ggf. importiert werden.

Externe Programmbibliotheken

Natürlich kommt es vor, dass die Java Class Library nicht ausreicht. Und gerade für komplexere Probleme, die von anderen Menschen längst gelöst wurden, sollte man - wie bereits erwähnt - lieber keine eigenen Lösungen entwickeln. Stattdessen empfiehlt es sich, auf das riesige Angebot frei verfügbarer (im Sinne von Open Source) Programmbibliotheken zurück zu greifen.

Es gibt elegantere (und nachhaltigere) Methoden, eine externe Programmbibliothek zu verwenden, als sich diese manuell herunterzuladen und einzubinden (die Möglichkeiten hierfür werden im nächsten Abschnitt kurz erläutert). Aber auch das ist möglich und reicht manchmal völlig aus.

Das folgende Szenario soll die möglichen Vorteile der Verwendung externer Bibliotheken verdeutlichen und zeigen, wie sich diese (zunächst ohne Build Tools, siehe unten) mit Hilfe der IDE in das Programm einbinden lassen.

Nehmen wir an, wir wollen die Überschrift der aktuellsten Pressemitteilung von der Internetseite der Universität zu Köln extrahieren und einfach nur auf der Konsole ausgeben. Versuchen wir es zunächst ohne externe Bibliotheken, also nur mit den Hausmitteln von Java (die Fehlerbehandlung wurde zugunsten der Übersichtlichkeit entfernt):

ACHTUNG! Das folgende Beispiel zeigt ganz bewusst sehr schlechten, unsinnigen Code! Man sollte niemals HTML (oder irgendeine andere formale Sprache) mit String-Operationen parsen, auch (oder: erst recht!) nicht mit Regulären ausdrücken!

String urlString = "https://portal.uni-koeln.de/"
		+ "universitaet/aktuell/presseinformationen";

BufferedReader br =
        new BufferedReader(
            new InputStreamReader(
                new URL(urlString).openStream())));

String line;
StringBuilder sb = new StringBuilder();

while ((line = br.readLine()) != null) {
    sb.append(line);
    sb.append(System.lineSeparator());
}

// VORSICHT, UNSINN!!! Niemals HTML mit String-Operationen parsen!!!
String heading = sb.toString()
        .replaceAll("\n", " ")
        .replaceFirst("^.*?<article([\\s\\S]*?)<\\/article>.*?$", "$1")
        .replaceFirst("^.*?<h2>([\\s\\S]*?)<\\/h2>.*?$", "$1")
        .trim();

System.out.println(heading);

Immerhin, die Ausgabe auf der Konsole lautet:

Sonnenscheinrekord im ersten COVID-19 Lockdown durch ungewöhnliches Wetter

Na, wenigstens ist das Wetter gut!

ABER das ist eine Menge Code - und er ist auch noch alles andere als robust! Viele ungeschriebene Gesetze wurden verletzt (siehe oben). Es ist außerdem nicht auf den ersten Blick ersichtlich, was hier genau passieren soll. Eine schlechte, sperrige Lösung!

Entscheiden wir uns also doch lieber dazu, eine externe Bibliothek zu nutzen, die auf das Lesen und Parsen von HTML-Dokumenten spezialisiert ist! Eine (zu Recht!) sehr prominente Kandidatin ist jsoup.

Wir laden uns also die neueste Version von jsoup als .jar Datei (Java Archive) herunter und platzieren sie in einem eigens angelegten Ordner lib (libraries) in unseren Projekt (der Name das Ordners ist beliebig):

ext-lib

Jetzt ist die Bibliothek schon mal vorhanden - aber unser Programm weiß noch nichts davon. Fügen wir sie also zum Build Path unseres Projektes hinzu (natürlich mit Hilfe unserer IDE). Dieser umfasst alle Ressourcen, die beim Kompilieren des Programms mit einbezogen werden sollen.

👉 Rechtsklick auf das Projekt → Properties → Java Build Path → Libraries → Classpath → Add JARs → .jar Datei aus dem Projekt-Ordner auswählen!

Ab jetzt sind die Klassen (…), die Teil der jsoup-Bibliothek sind, für unser Programm verfügbar. Wir müssen sie einfach nur mittels import importieren!

Sehen wir uns also die (sehr gute) Dokumentation von jsoup an und machen uns ein Bild davon, wie uns die Bibiothek bei unserem Problem helfen kann (dieser Prozess wird hier nicht erläutert)! Der Code aus dem Beispiel oben lässt sich unter Verwendung der API von jsoup nicht nur schöner und lesbarer, sondern auch viel kürzer umsetzen (auch hier verzichten wird der Übersichtlichkeit halber auf die Fehlerbehandlung):

String urlString = "https://portal.uni-koeln.de/"
		+ "universitaet/aktuell/presseinformationen";
Document doc = Jsoup.connect(urlString).get();
String heading = doc.selectFirst("article h2").text();
System.out.println(heading);

… und das war’s auch schon! Plötzlich spricht jede Zeile des Codes für sich - alles ist sehr eindeutig. Wir sehen: Die Java Class Library ist zwar extrem umfangreich, aber reicht eben nicht immer aus.

Fazit: Es lohnt sich, nach guten Programmbibliotheken Ausschau zu halten!

Build Management Tools

Build tools haben die Aufgabe, das “Bauen” einer Anwendung zu koordinieren. Dies umfasst z.B. das Verwalten von Ressourcen, das Kompilieren des Quellcodes (ggf. nur von geänderten Dateien) und das automatische Ausführen von Unit Tests. Ein bekanntes und altbewährtes Java Build Tool ist Apache Ant.

Meist wird neben den oben erläuterten Funktionen aber eine umfassendere Verwaltung des Projektes benötigt. Besonders eine automatische Verwaltung von Abhängigkeiten (eng.: dependency management), also von eingebundenen Programmbibliotheken, deren eigenen Abhängigkeiten usw.

Im vorherigen Abschnitt wurde bereits erwähnt, dass das manuelle Einbinden von Programmbibliotheken etwas unelegant ist. Man müsste, wollte man das Projekt mit anderen Entwickler*innen teilen, immer alle verwendeten Bibliotheken mitliefern - obwohl diese ja gar nicht Teil des eigentlichen Programmcodes sind. Oder noch schlimmer: Andere Personen müssten sich selbst auf die Suche nach den verwendeten Bibliotheken machen und diese herunterladen. Das Projekt wäre nicht portabel oder unnötig einfach aufgebläht.

Genau darum kümmern sich build management tools (oder auch build automation tools) - sie umfassen nicht nur die Funktionen eines build tools (wie Apache Ant, siehe oben), sondern verwalten den gesamten Lebenszyklus eines Software-Projektes von der Projektstruktur über das Herunterladen oder Aktualisieren der Abhängigkeiten bis hin zum Auführen von Unit Tests und dem eigentlichen Bauen der Anwendung mit allen verwendeten Ressourcen.

Die im Java-Kontext am meisten verbreiteten build management tools sind Maven (genau wie Ant ebenfalls von der Apache Foundation) und Gradle (wird vor allem - aber nicht nur - in der Entwicklung von Anwendungen für die Android-Plattform genutzt).

🔗 Eine detaillierte Abgrenzung der genannten Tools wird an dieser Stelle nicht geschehen, ist aber unter dem o.g. Link verfügbar.

🔗 Eine brauchbare Einführungen in Maven (vor allem in Hinsicht auf die Integration in die Eclipse IDE) findet man hier.