2012-04-11 10 views
23

Dato che il Java 6 SE JRE pubblico si avvicina al suo EOL (Nov '12), sto considerando di trasferire i miei progetti da Java 6 a Java 7. Questo non sarebbe un grosso problema, se Apple fornisse un Java 7 JRE per Mac OS X. Ma poiché Apple non è disposta a farlo, devo ancora supportare utenti che hanno solo un JRE Java 6.È possibile compilare file di classe con Java 7 SDK che può essere eseguito su Java 6 JVM?

C'è un modo per compilare i binari compatibili con Java 6 (file di classe) con Java 7 javac? Certamente sono consapevole che non posso usare le nuove funzionalità di Java 7 quando lo faccio.

Grazie in anticipo!

+1

Correlato: http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -run-t – assylias

+0

possibile duplicato di [Set ant bootclasspath: JDK 1.7 ha un nuovo avviso javac per l'impostazione di una fonte precedente senza bootclasspath] (http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-warning-for-setting-an-older-sour) –

+0

Duplicato di http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze

risposta

21

Dipende. Se il tuo programma non usa le nuove estensioni della lingua Java 7, puoi eseguire il compilatore Java con le opzioni -source 1.6 e -target 1.6. Ma se usi le estensioni del linguaggio Java 7, allora -source 1.6 provocheranno errori di compilazione.

Certamente sono consapevole del fatto che non posso utilizzare le nuove funzionalità di Java 7 quando lo faccio.

Ciò include le funzionalità del linguaggio Java 7 ... e le dipendenze dalle modifiche di Java 7 alle API della libreria di classi standard. Si noti inoltre che esistono un numero limitato di differenze comportamentali (ovvero correzioni di bug API) che potrebbero causare l'esecuzione di codice in modo diverso su Java 6 e Java 7. Dovrebbero essere descritte nel documento di transizione Java 6 a Java 7.


AGGIORNAMENTO - Questo probabilmente non è più un problema per voi in ogni caso, perché Oracle ha rilasciato Java 7 per Mac OSX.

+0

Se continui a ricevere errori, puoi tornare temporaneamente su Java 6. Trova il percorso eseguendo '/ usr/libexec/java_home -v '1.6 *''. Quindi, impostalo come percorso home Java usando 'export JAVA_HOME ="/percorso/su/java6/"'. Verificare che funzionasse eseguendo 'java -version'. – user2398029

+0

@louism - Su Windows e Linux (almeno) l'impostazione di JAVA_HOME non influenza direttamente quale comando viene eseguito quando si esegue 'java'. Mac OSX è diverso? –

+0

Sembra proprio! Vedi gist.github.com/4394202. – user2398029

5

ho installato jdk6. se si controlla la pagina man di javac:

Cross-Compilation Options 
      By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐ 
      ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath 
      and -extdirs when cross-compiling; see Cross-Compilation Example below. 

     -target version 
      Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier 
      versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6). 
3

Sì, ma in alcuni casi no. In java 1.6 non hanno provato con risorse, switch con stringhe o istruzioni multi catch ecc. Quindi quelle parti del programma non verranno compilate. Ma l'idea di java è una volta compilata, eseguita ovunque; quindi il codice può funzionare su vecchie JVM

3

La risposta di Stephen C è corretta, ma non completa. I tuoi programmi Java 7 non verranno compilati in Java 6 se utilizzano le funzionalità del linguaggio Java 7, ma si avverte che altri bug possono ancora verificarsi con una codifica sviluppatore in Java 6 e un'altra in Java 7.

Prendi ad esempio java. sql.Driver. In Java 7, l'interfaccia ha ottenuto un metodo aggiuntivo.

Java 7 Developer questo sviluppatore implementa l'interfaccia del driver e usa l'annotazione 'Override' sul metodo driver aggiuntivo implementato. Il programma si compila bene come un programma Java 6 perché la classe che il compilatore Java 6 vede ha quel metodo e il codice viene archiviato. Compilare il programma come Java 6 non significa che il compilatore Java 6 cambierà automaticamente per usare l'origine Java 6 codice!

Java 6 Developer Lo sviluppatore Java 6 tenta di costruire il codice Java 7 sviluppatore impegnato e ottiene un errore di compilazione, anche se lo sviluppatore Java 7 non è stato mettere in atto qualsiasi costrutti del linguaggio Java 7.

Di conseguenza, anche se si potrebbe compilarlo come Java 6, mi consiglia di non farlo.

Problemi correlati