© Excellent backgrounds/Shutterstock.com
Einführung in Apache Tamaya

Konfiguration in Java


Konfiguration erlaubt es, das Verhalten eines Softwaresystems in kontrollierter Art und Weise zu verändern, ohne dass eine Neuimplementierung notwendig ist. Dazu sind Design­entscheidungen darüber zu treffen, welche Aspekte konfigurierbar sind und welche eben nicht. Alles konfigurierbar zu machen, ist genauso sinnlos, wie alle Aspekte fest zu kodieren. Dennoch scheiden sich die Geister daran, was Konfiguration nun ist und wie sie gemanagt werden soll. Wir möchten mit dieser mehrteiligen Artikelreihe Licht ins Dunkel bringen.

Konfiguration ist ein häufiges und sehr facettenreiches Thema in der Softwarewelt. Auch wenn es bisher keine einheitliche Lösung für Konfiguration in Java gibt, wurden im letzten Jahr einige Anstrengungen unternommen, dies zu ändern. Daraus ist das neu gegründete Projekt Apache Tamaya [1] entstanden, mit dem eine Lösung für die vielfältigen Aufgaben der Konfiguration entwickelt werden soll.

Im Rahmen dieser Artikelreihe werden wir die Themen Konfiguration und Apache Tamaya genauer betrachten. Schnell wird sich zeigen, dass jeder eine Vorstellung davon hat, was Konfiguration ist und leisten soll. Unglücklicherweise werden sich kaum zwei Ansichten als deckungsgleich zeigen, was auch mit der Vielzahl der Anwendungsfälle zusammenhängt. In dieser Ausgabe werden wir uns zuerst sehr einfachen Einsatzszenarien im Java-SE-Umfeld widmen und dann im weiteren Verlauf immer neue Anforderungen aus anderen Einsatzbereichen, wie Java EE, Microservices und Cloud-basierten Anwendungen, hinzufügen. Ziel ist es, die Komplexität verständlich zu veranschaulichen, aber auch Gemeinsamkeiten aufzuzeigen. Diese erlauben es, Konfigurationsaspekte in einem Framework zu modellieren, so wie es aktuell mit Apache Tamaya gemacht wird.

Konfiguration mit Java SE

Lassen Sie uns zunächst die Konfigurationsmechanismen näher betrachten, die bereits mit Java geliefert werden. Das prominenteste Beispiel sind sicherlich .properties-Dateien, die sowohl in Textform als auch in xml-Form unterstützt werden. Dazu bietet die Klasse java.util.Properties Methoden, um einen entsprechenden InputStream zu lesen. Anschließend können die konfigurierten Werte mit getProperty(key) ausgelesen werden:

InputStream is = ...; Properties properties = new Properties(); properties.read(is); // properties.readXml(is);

Derselbe Mechanismus wird nun auch an anderen Stellen im JDK wiederverwendet, z. B. im Zusammenhang mit ResourceBundle oder dem java.util.ServiceLoader. Letzterer erlaubt es, Services zentral zu registrieren. Diese werden dabei in Dateien, die dem qualifizierten Typ des Zugriffs entsprechen, unter META-INF/services im Klassenpfad abgelegt. Der ServiceLoader berücksichtigt hierbei alle Dateien, die aktuell im Klassenpfad sichtbar sind. Der Zugriff auf die Services erfolgt sodann typsicher mit

ServiceLoader<T> ServiceLoader.load(Class<T> type);

Weitere Mechanismen sind Environment- und System-Properties. Während Erstere aus den Umgebungsvariablen der Laufzeitumgebung konstruiert werden, können Letztere als Parameter der Java-Runtime übergeben werden, z. B. mit -DmyProperty=foorBar. Mit System.getenv() und System.getProperties() stehen entsprechende Zugriffs-APIs zur Verfügung, mit denen die Werte direkt ausgelesen werden können.

Es würde den Rahmen dieses Artikels sprengen, jeden Konfigurationsmechanismus zu beschreiben, der im JDK bereits mitgeliefert wird. Dennoch liefern die Beispiele erste Anhaltspunkte, wie Konfiguration modelliert werden könnte:

  • Konfigurationsdateien sind textbasiert.

  • Konfiguration kann in sehr unterschiedlichen Formaten verfügbar sein (properties, xml, json etc.).

  • Konfiguration kann aus unterschiedlichen Quellen stammen (Dateisystem, Klassenpfad, URLs etc.).

  • Konfiguration kann auf mehrere Ressourcen aufgeteilt sein, wobei zur Laufzeit die effektive Auswahl getroffen wird.

  • Konfiguration kann dazu verwendet werden, höherwertige Dienste zur Verfügung zu stellen (z. B. ServiceLoader, ResourceBundle).

  • Mit Konfiguration können einfache Werte in Abhängigkeit ganz unterschiedlicher Laufzeiteigenschaften dynamisch gesetzt werden, oder es werden ganze Systemteile und Komponenten für die Zielumgebung aktiviert oder deaktiviert.

Bereits mit den wenigen vorhandenen Mechanismen können wir ganze Applikationen konfigurieren. Allerdings m...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang