This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
|
175
First
Max.
Linie
Max.
Linie
Kapitel 9
KAPITEL 9
Java
Viele Java-Entwickler bevorzugen die Arbeit mit einer Integrierten Entwicklungsumge-
bung (Integrated Development Environment, IDE) wie Eclipse. Angesichts wohlbekann-
ter Alternativen wie Ant oder eben einer Java-IDE fragt sich der Leser vermutlich, warum
er
make in einem Java-Projekt einsetzen sollte. Dieses Kapitel soll daher die Vorzüge von
make in einem solchen Projekt beschreiben. Insbesondere werden wir ein generisches
Makefile mit den Standardzielen erstellen, das man ohne weiteres mit minimalen Ände-
rungen in einem typischen Java-Projekt einsetzen kann.
Die Arbeit mit Java in
make wirft einige Fragen auf, bietet aber andererseits auch einige
Möglichkeiten. Vor allem die folgenden drei Faktoren fallen dabei ins Gewicht: die
extrem hohe Geschwindigkeit des Java-Compilers
javac, die Unterstützung der Syntax
@dateiname zum Lesen von Kommandozeilenargumenten aus einer Datei sowie die durch
die Java-Spezifikation vorgegebene Suche nach einer .class-Datei anhand des Package-
Namens.
Die üblichen Java-Compiler sind sehr schnell. Das liegt vor allem an der Funktion der
import-Anweisung. Prinzipiell ähnelt sie einem #include in C und dient dem Zugriff auf
extern definierte Symbole. Allerdings ist die von Java gelesene externe Datei nicht der
Quelltext, sondern die kompilierte .class-Datei. Mit anderen Worten, die Notwendigkeit
zur Analyse des Quelltexts durch den Parser entfällt beim Import. Da sich die Symbole in
einer .class-Datei nicht ändern können (es gibt ja keine Präprozessordefinitionen, die zu
berücksichtigen wären), kann der Compiler intern einen Cache importierter und kompi-
lierter .class-Dateien im Hauptspeicher anlegen. Schon in mittelgroßen Projekten bedeu-
tet das, dass der Java-Compiler im Vergleich zu einem C-Compiler mehrere Millionen
Zeilen weniger Quelltext lesen, parsen und analysieren muss. Ein weiterer, allerdings
weniger bedeutender Geschwindigkeitsgewinn wird dadurch erzielt, dass die meisten
Java-Compiler erheblich weniger Optimierungen durchführen. Java verlässt sich statt-
dessen meistens auf die ausgetüftelten Optimierungen des in die virtuelle Maschine von
Java (JVM) integrierten Just-in-time-Compilers (JIT).
This is the Title of the Book, eMatter Edition
Copyright © 2005 O’Reilly & Associates, Inc. All rights reserved.
176
|
Kapitel9: Java
Links
Max.
Linie
Max.
Linie
Die meisten Java-Projekte machen ausgiebigen Gebrauch von der package-Anweisung.
Ein Package definiert die Sichtbarkeit der Symbole in einer Datei. Package-Namen sind
hierarchisch und spezifizieren eine implizite Verzeichnisstruktur. Zum Beispiel gehört
zum Package
a.b.c das Verzeichnis a/b/c. Der aus einer Klasse im Package a.b.c kompi-
lierte Code landet als Datei im Verzeichnis a/b/c. Für
make ist das ein Problem, denn der
normale Algorithmus zur Assoziation von Binärdateien mit Quelltexten scheitert hier.
Andererseits entfällt die Notwendigkeit, die Option
-o zur Platzierung der Ausgabeda-
teien anzugeben. Es genügt, das oberste Verzeichnis des Binärbaums anzugeben, das für
alle Dateien dasselbe ist. Demzufolge ist es ohne weiteres möglich, mit einem Aufruf des
Compilers Quelltexte aus vielen verschiedenen Verzeichnissen zu kompilieren.
Die üblichen Java-Compiler unterstützen die Syntax
@dateiname zum Lesen von Kom-
mandozeilenparametern aus einer Datei. Mit anderen Worten: Die Länge der Komman-
dozeile spielt keine Rolle. Im Zusammenhang mit den Packages bedeutet dies, dass man
ohne weiteres die gesamten Quelltexte eines Projekts durch einen einzigen Aufruf des
Java-Compilers übersetzen kann. (Bei C oder C++ dagegen fällt schon allein die Zeit zum
Starten des Compilers ins Gewicht, die bei jedem Aufruf des Programms erforderlich ist.)
Zusammenfassend kann man durch einen einzigen geschickten Aufruf des Java-Compi-
lers ohne weiteres 400.000 Zeilen Java-Quelltext in ca. 3 Minuten auf einem Pentium 4
mit 2,5 GHz kompilieren. Eine äquivalente C++-Anwendung zu kompilieren würde
Stunden dauern.
Alternativen zu make
Wie bereits erwähnt, sind Java-Entwickler meistens gerne bereit, neue Technologien und
Werkzeuge einzusetzen. Vergleichen wir daher zwei dieser Werkzeuge mit
make, nämlich
Ant sowie eine IDE.
Ant
Die Java-Gemeinschaft ist sehr aktiv. Neue Werkzeuge und APIs entstehen mit beeindru-
ckender Geschwindigkeit. Eines dieser Werkzeuge ist
Ant, das als Ersatz für make in der
Entwicklung von Java-Projekten geschrieben wurde. Analog zu
make benutzt Ant eine
Datei, die Ziele und Abhängigkeiten eines Projekts spezifiziert. Im Gegensatz zu
make ist
Ant in Java geschrieben. Die von Ant erzeugten Dateien sind XML-Dateien.
Um Ihnen eine Vorstellung von der Syntax von
Ant zu vermitteln, betrachten Sie den fol-
genden Ausschnitt aus einer solchen XML-Datei:
<target name="build"
depends="prepare, check_for_optional_packages"
description="--> übersetzt die Quelltexte">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes}"/>
<mkdir dir="${build.lib}"/>

Get GNU make, 3rd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.