2009-04-15 3 views
1

hier ist mein Szenario:Java baut mit verschiedenen JDK-Versionen: gleiche Artefakte?

  • Workstation A: Sun JDK 1.6
  • Workstation B: Sun JDK 1,5

ich auf A bauen und B mit Ant 1,7

<javac srcdir="${foo}" destdir="${bar}" source="1.5" target="1.5"> 
    <include name="**/*.java"/> 
    <exclude name="**/test/**/*.java"/> 
</javac> 

aber die .class Dateien sind unterschiedliche Größe auf A & B, geschweige denn CRC. soll es so sein? oder fehlt mir etwas Offensichtliches?

Antwort

5

Ja, es soll so sein. Auch wenn sie auf dieselbe VM abzielen, können verschiedene Compiler unterschiedliche Bytecodes ausgeben. Solange sich das resultierende Programm korrekt verhält, legt die JLS nicht genau fest, wie der Quellcode in den Byte-Code kompiliert wird.

5

Während Sie könnten explizit source="1.5" und target="1.5", tut dies nicht Kontrolle, die JDK-Version des javac Compiler Sie ausgeführt werden.

Also, auf der Workstation mit JAVA_HOME/PATH auf JDK 1.6 zeigen, haben Sie Klassen-Dateien auf einem 1.6 Javac, die mit einem 1.5 JRE kompatibel sein sollte.

Die source="1.5" und target="1.5" geben jedoch nur die Kompatibilität der Syntax/Sprache-Features an; Wenn Sie sich auf einige Klassen verlassen, die nur in der 1.6 JRE verfügbar sind, erhalten Sie hier keine Compiler-Warnung, wenn Sie source="1.5" und target="1.5" auf einem 1.6-Javac verwenden.

Um diesen letzten Punkt zu adressieren, müssen Sie die Ant-Task <javac> anweisen, eine andere bootclasspath zu verwenden.

+0

+1 - nicht für die Antwort, aber für den nützlichen Tipp (hatte nicht daran gedacht) –

+0

Es ist eine ziemlich lahme Abhilfe - es wäre viel einfacher, nur die richtige eingerückte jdk zu verwenden –

Verwandte Themen