2013-08-19 11 views
14

Quindi ragazzi,Javac Cross-Compilation con 1,7

Sto cercando di giocare un po 'con la compilation Javac Croce con Ant e sul terminale. A livello locale e in un ambiente di integrazione e sto avendo lo stesso problema sul problema di base.

ho eseguito questo nel terminale Linux (e anche sul mio Cygwin su Windows e il cmd):

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

con Main.java con niente altro che uno System.out.println.

javac -version ==> javac 1.7.0_11 

che sto ricevendo il messaggio di errore:

javac: source release 1.7 requires target release 1.7 

ho più o meno la stessa configurazione sulla mia macchina Windows locale con gli stessi risultati.

Ho capito che la compilazione incrociata riguarda la compilazione di un codice sorgente compatibile con una versione più alta di jdk che utilizza la versione superiore di jdk, ma che passa il file rt.jar della versione di destinazione presumibilmente inferiore.

se target e source sono uguali, ha funzionato.

target=1.7 and source=1.7 workd fine 

target=1.6 and source=1.6 worked just fine 

ma voglio cross-compilation, quindi cosa sto facendo di sbagliato?

Apprezzo tutto l'aiuto che ho potuto ottenere e grazie in anticipo.

risposta

12

Non è possibile avere una versione più recente di origine e versione inferiore di destinazione. Ad esempio, in Java 5, sono state aggiunte una serie di nuove funzionalità alla lingua, come generici, autoboxing e non ci si può aspettare che una JVM 1.4 la capisca. Quindi, devi dire al compilatore che il tuo codice sorgente è il codice sorgente Java 1.4. Questo spiega i risultati che hai.

L'impostazione predefinita per -target dipende dal valore di -source:

  • Se -source non è specificato, il valore di -target è 1,7
  • Se -source è 1,2, il valore di - bersaglio è 1.4
  • Se -source è 1,3, il valore di -target è 1,4
  • Se -source è 1,5, il valore di -target è 1,7
  • Se -source è 1,6, il valore di -target è 1.7
  • Per tutti gli altri valori di -source, il valore di -target è il valore di -source.

Per maggiori informazioni si riferiscono a http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

+4

che non ha senso però, perché avrei bisogno di limitare il mio codice perfettamente 1.6 compatibile, per eseguire solo con 1.7. Ho potuto vedere solo l'altro modo, che avrei un codice 1.7 che un 1.7 JVM può capire perfettamente e mi da il codice da 1,6 byte. I generici vengono persi in runtime e pertanto il loro codice byte potrebbe essere reso adatto per 1.4 se necessario. Cos'è allora la cross compilation? –

+0

inoltre, c'erano molte risorse su Internet che dicevano che è possibile: http://stackoverflow.com/questions/8970920/maven-javac-source-release-1-6-requires-target-release-1-6 http://fantom.org/sidewalk/topic/1765 questo suggerisce che è possibile targetizzare 1.5 da 1.6 (totalmente) logico. che contraddice la documentazione ufficiale fornita. Sono abbagliato qui. –

+0

Dai un'occhiata, sarà utile: http://stackoverflow.com/questions/1927594/is-is-possible-to-build-java-code-using-jdk-1-6-to-run-on- jre-1-5 – vinay

2

Questo è un limite in javac. Nota che potresti farla franca semplicemente specificando "-target" (e non -source) nelle versioni precedenti di javac. Potresti essere ancora in grado di farlo.

È possibile prendere in considerazione l'utilizzo del compilatore Java Eclipse (ecj), disponibile come compilatore autonomo, come plug-in maven e che può essere utilizzato anche dall'attività javac negli script delle formiche.

Vedere http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.user/tasks/task-using_batch_compiler.htm per dettagli.

+0

un altro motivo per noi di trasferirsi a Maven. Grazie per le informazioni –

Problemi correlati