2013-08-19 16 views
14

So Jungs,Javac Cross-Compilation mit 1.7

Ich versuche, ein wenig mit Javac Cross Compilation mit Ant und am Terminal zu spielen. Lokal und auf einer Integrationsumgebung und ich habe das gleiche Problem auf dem sehr grundlegenden Problem.

Ich betreibe diese in der Linux-Terminal (und auch auf meine Cygwin unter Windows und die cmd):

javac -target 1.6 -source 1.7 -bootclasspath /usr/java/jdk1.6.0_27/jre/lib/rt.jar Main.java 

mit Main.java mit anderen nichts als ein System.out.println.

javac -version ==> javac 1.7.0_11 

Ich erhalte die Fehlermeldung:

javac: source release 1.7 requires target release 1.7 

ich mit den exakt gleichen Ergebnisse auf meinem lokalen Windows-Rechner in etwa die gleiche Konfiguration aufweisen.

Es war mein Verständnis, dass Cross Compilation ist alles über das Kompilieren einiger Quellcode, der mit einer höheren Version jdk mit dieser höheren Version von jdk kompatibel ist, aber die rt.jar der Zielversion, die angeblich niedriger ist.

Wenn Ziel und Quelle gleich sind, hat es funktioniert.

target=1.7 and source=1.7 workd fine 

target=1.6 and source=1.6 worked just fine 

aber ich möchte Cross-Compilation, also was ist es, dass ich falsch mache?

Ich schätze all die Hilfe, die ich bekommen konnte und danke im Voraus.

Antwort

12

Sie können keine neuere Version der Quelle und der niedrigeren Version des Ziels haben. In Java 5 wurden der Sprache beispielsweise einige neue Funktionen hinzugefügt, z. B. Generika, Autoboxing, und Sie können nicht erwarten, dass eine JVM 1.4 sie versteht. Sie müssen also dem Compiler mitteilen, dass Ihr Quellcode Java 1.4-Quellcode ist. Dies erklärt die Ergebnisse, die Sie haben.

Die Standardeinstellung für -target hängt vom Wert von -Quelle:

  • Wenn -source nicht angegeben wird, ist der Wert von -target 1,7
  • Wenn -source 1,2, der Wert von - Ziel ist 1,4
  • Wenn -source 1,3 ist, der Wert von -target 1,4
  • Wenn -source 1,5 ist, der Wert von -target 1,7
  • Wenn -source 1,6 ist, der Wert von -target ist 1.7
  • Für alle anderen Werte von -source ist der Wert von -target der Wert von -source.

Für weitere Informationen siehe http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

+4

das macht aber keinen Sinn, warum müsste ich meinen perfekt 1.6 kompatiblen Code beschränken, um nur mit 1.7 zu laufen. konnte ich nur anders sehen, wo ich einen 1.7 Code haben würde, den eine 1.7 JVM vollkommen gut verstehen kann und mir den 1.6 Byte Code gibt. Generics sind auf Runtime verloren und daher kann ihr Byte-Code bei Bedarf für 1.4 geeignet gemacht werden. Was ist Cross Compilation dann gut? –

+0

Außerdem gab es viele Ressourcen im ganzen Internet sagen, dass es möglich ist: http://StackOverflow.com/Questions/8970920/maven-Javac-Source-Release-1-6-requires-Target-Release-1-6 http://fantom.org/sidewalk/topic/1765 Dies deutet darauf hin, dass es möglich ist, 1,5 von 1,6 (vollständig) logisch anzusteuern. widerspricht der offiziellen Dokumentation, die Sie zur Verfügung gestellt haben. Ich bin hier geblendet. –

+0

Überprüfen Sie dies, es wird hilfreich sein: http://StackOverflow.com/Questions/1927594/isis-possible-to-build-java-code-using-jdk-1-6-to-run-onon- jre-1-5 – vinay

2

Dies ist eine Grenze in javac ist. Beachten Sie, dass Sie in älteren Versionen von javac einfach "-target" (und nicht -source) angeben könnten. Du könntest es immer noch können.

Sie sollten den Eclipse Java Compiler (ecj) in Erwägung ziehen, der als eigenständiger Compiler, als Maven-Plug-in und auch von der javac-Task in ant-Skripten verwendet werden kann.

Weitere Informationen finden Sie unter http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.user/tasks/task-using_batch_compiler.htm.

+0

ein weiterer Grund für uns, nach Maven zu ziehen. Danke für die Info –