Christian Seiler: Attribut -target

Beitrag lesen

Hallo,

Gibts hierfür eine Doku oder ähnliches?

Ja klar, siehe:
http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javac.html#options

Ich finde in der Insel keinen Hinweis auf dieses Attribut. Dafür wird -source mit vergleichbaren Eigenschaften aufgelistet.

Ja, sehe ich auch gerade, dort steht:

| Erzeugt Bytecode für eine bestimmte Java-Version.

Das ist aber falsch! Denn:

Welcher Unterschied besteht zwischen Deinem -target und dem dort zu findenen -source?

Der Unterschied zwischen -source und -target ist folgender:

-source definiert, wie der Sourcecode zu interpretieren ist. Java hat nämlich im Laufe der Zeit zusätzliche Features bekommen, die zum Beispiel auch neue Schlüsselwörter hinzugefügt haben, wie zum Beispiel 'enum'. Damit Java-Code von früheren Java-Versionen dennoch unter neuen Java-Versionen kompiliert, kann man mit -source einstellen, dass der Java-Compiler Quellcode noch nach dem alten Sprachstandard behandelt, d.h. z.B. 'enum' als Schlüsselwort ignoriert und als Bezeichner zulässt.

-target definiert dagegen, was für eine Art Bytecode generiert wird. Das heißt: -target gibt an, unter welchen Java-Versionen der Sourcecode mindestens laufen wird. Zum Beispiel läuft ein mit -target 1.3 kompiliertes Programm unter allen JREs ab 1.3, ein mit -target 1.6 kompiliertes Programm derzeit nur unter einer JRE 1.6.

Allerdings sind -target und -source nicht komplett unabhängig: Zusätzliche Sprachfeatures brauchen auch zusätzliche Möglichkeiten im Bytecode. Daher ist es nur möglich, ein -target anzugeben, was mindestens so groß ist, wie -source, d.h. -target 1.5 -source 1.4 funktioniert, -target 1.4 -source 1.5 funktioniert nicht.

Zudem gibt es noch weitere Dinge, die zu beachten sind: Zwar mag der generierte Bytecode dann kompatibel sein, allerdings verwendet der Java-Compiler im Default-Modus dennoch den Classpath des installierten JDK - und das kann evtl. besser passende Mehoden enthalten, die aber in älteren JREs nicht vorhanden sind. Das führt dann dazu, dass der Bytecode zwar kompatibel ist, aber versucht, eine Methode zu finden, die's in der älteren JRE nicht gibt. Daher sollte man im Zweifel auch -bootclasspath mit angeben, wenn man eine neuere javac-Version verwendet - dazu braucht man natürlich wiederum die Standard-Java-Klassenbibliothek der älteren Version, auf die man verweisen kann.

Viele Grüße,
Christian