B.5 | javac |
javac ist der Compiler des SDK. Durch ihn wird aus dem Quelltext der plattformunabhängige Bytecode erzeugt. javac ist ein Programm, das selbst auch in Java geschrieben ist. Als Parameter erhält er neben vielen Optionen, die fakultativ angegeben werden können, die Namen von ein oder mehreren Quelltextdateien von Java-Klassen. Jede Quelltextdatei muss die Endung .java besitzen. Die von javac erzeugten Dateien besitzen die Endung .class.
Auchbei javac werden seit dem JDK 1.2 die Optionen in Standard-Optionen und Nicht-Standard-Optionen unterteilt. Es können folgende Standard-Optionen angegeben werden:
Per Voreinstellung benutzt der Compiler vom SDK die System-Klassendateien, die mit dem SDK mitgeliefert werden. Ebenso werden die Erweiterungen automatisch im ext-Verzeichnis der SDK-Installation gesucht. javac erlaubt es, diese Einstellungen zu ändern und die Kompilierung mit den Systemklassen einer anderen Java-Version vorzunehmen. Hierfür stehen folgende Optionen zur Verfügung:
- -classpath <path>
gibt den Pfad an, in dem javac nach Klassen sucht. Diese Option setzt die CLASSPATH-Umgebungsvariable außer Kraft. Mehrere Pfade müssen durch ; (Windows) bzw. : (UNIX) getrennt werden.- -d <directory>
gibt das Verzeichnis an, in dem die kompilierten Klassen gespeichert werden. Falls nicht angegeben, wird das aktuelle Verzeichnis verwendet.- -deprecation
veranlasst den Compiler, detaillierte Meldungen über die Benutzung von Methoden auszugeben, die mit dem SDK nicht benutzt werden sollten, da sie von älteren Versionen stammen und ersetzt wurden. Für jede dieser Methoden existiert in der aktuellen SDK-Version eine äquivalente Funktion. Welche Funktion genau als Ersatz verwendet werden sollte, kann der Referenz entnommen werden. Ohne diese Option gibt der Compiler bei Verwendung solcher Funktionen nur eine Warnung aus, die darauf hinweist, dass veraltete Funktionen benutzt werden.- -encoding <enc>
erlaubt es anzugeben, in welcher Zeichenkodierung die Quelltexte vorliegen. Wenn man diese Option nicht angibt, wird die Standardkodierung für die verwendete Plattform angenommen. Gültige Werte für <enc> können dem Anhang D entnommen werden.- -g
veranlasst den Compiler, den Bytecode mit sämtlichen Debugging-Informationen zu versehen. Per Voreinstellung werden nur Zeilennummer und Informationen über den Quelltext erzeugt. Diese Option ist erforderlich, wenn lokale Variablen im Debugger untersucht werden sollen.- -g:none
veranlasst den Compiler, keine Debugging-Informationen in den Bytecode aufzunehmen. Dadurch wird der erzeugte Bytecode deutlich kleiner.- -g:<info>
veranlasst den Compiler, nur einen Teil der Debugging-Information in den Bytecode aufzunehmen. <info> muss durch einen der Werte source, lines und vars ersetzt werden. Hierduch werden entweder Informationen über den Quelltext, Zeilennummern oder lokale Variablen erzeugt. Es ist auch erlaubt, mehrere Werte durch Kommas getrennt anzugeben.- -nowarn
unterdrückt die Ausgabe von Warnungen.- -source <version>
Dieser Schalter muss gesetzt werden, wenn Quelltexte übersetzt werden sollen, die Zusicherungen verwenden. <version> muss dabei auf 1.4 oder höher gesetzt werden.- -sourcepath <sourcepath>
erlaubt es, den Pfad zu den Java-Quelltexten anzugeben. <sourcepath> enthält eine Liste von Pfaden zu Verzeichnissen, JAR- und ZIP-Dateien. Mehrere Pfade müssen durch ; (Windows) bzw. : (UNIX) getrennt werden. Werden zu einer benötigten Klasse nur die Quelltexte gefunden bzw. ist der Quelltext neuer als die Klassendatei, so wird der Quelltext automatisch neu kompiliert.- -verbose
muss angegeben werden, wenn Compiler und Linker die Namen der gerade kompilierten Quelldateien und geladenen Klassendateien ausgeben sollen.Im Folgenden werden die Nicht-Standard-Optionen von javac beschrieben:
- -target <version>
erlaubt die Angabe der Java-Version, mit der die erzeugten Klassendateien kompatibel sind. Gültige Werte für <version> sind 1.1, 1.2, 1.3 und 1.4. Dabei gilt jeweils, dass der erzeugte Bytecode jeweils auf allen VMs der jeweiligen Version und neueren Versionen läuft, nicht aber auf älteren. Bei Angabe von 1.3 werden also Klassendateien erzeugt, die sowohl auf Interpretern der Version 1.3 als auch auf Interpretern der Version 1.4 lauffähig sind, nicht aber auf 1.1 oder 1.2. Die Voreinstellung ist 1.4.- -bootclasspath <bootclasspath>
Mit dieser Option muss beim Cross-Compiling der Pfad geändert werden, unter dem die System-Klassen gesucht werden. Mehrere Pfade müssen durch ; (Windows) bzw. : (UNIX) getrennt werden.- -extdirs <dirlist>
Mit dieser Option können Verzeichnisse angegeben werden, in denen nach Erweiterungspaketen gesucht wird. Mehrere Pfade müssen durch ; (Windows) bzw. : (UNIX) getrennt werden.Will man oft viele Quelltexte zusammen kompilieren, hat man die Möglichkeit, die Namen aller Quelltexte in einer Datei zu speichern. In jeder Zeile muss hierbei genau eine Quelltext-Datei aufgeführt werden. Beim Aufruf von javac kann man nun statt einer Auflistung von allen zu kompilierenden Quelltext-Dateien lediglich die Datei angeben, in der die Namen der Quelltexte aufgelistet sind. Hierbei wird dem Dateinamen ein @ vorangestellt. Der Aufruf
- -X
listet die verfügbaren Nicht-Standard-Optionen auf.- -Xstdout <file>
veranlasst den Compiler, Meldungen in die Datei <file> zu schreiben. Per Voreinstellung werden Fehlermeldungen auf der Standardfehlerausgabe (System.err) ausgegeben.- -Xswitchcheck
Prüft case-Blöcke in switch-Anweisungen darauf, ob sie über break-Anweisungen verfügen und gibt Warnungen aus, falls das nicht der Fall ist.- -J<javaoption>
ermöglicht es, eine Option an den Interpreter zu übergeben, in der javac ausgeführt wird. Für jede durchzureichende Option muss -J separat angegeben werden. Zwischen -J und <option> darf kein Leerzeichen sein (z.B. -J-verbose).javac @sourcefiles.txtkompiliert alle Quelltext-Dateien, die in der Datei sourcefiles.txt aufgeführt sind.
Alternativ können natürlich auch Shell-Wildcards auf der Kommandozeile benutzt werden. So werden mitjavac *.javaalle Quelltexte im aktuellen Verzeichnis übersetzt.