Breve domanda: se utilizzo le funzionalità di linguaggio Java 7 relativamente "minori" precedentemente non disponibili in Java 6, come il blocco try-muticatch ... ciò implica che il mio programma non verrà eseguito nelle macchine con JRE 6 o JRE 5 installato dopo essere stato compilato così com'è? Se è corretto, c'è un modo rapido per produrre un eseguibile .jar JRE6 senza modificare un codice sorgente Java 7 (che, a proposito, l'unica funzionalità di Java 7 che userebbe è il blocco try-multicatch)?Compatibilità con le versioni precedenti di java 7
risposta
Sei corretto. Multi-catch è una funzionalità del linguaggio Java 7 e non esiste un modo per compilarlo in bytecode compatibile con JVM Java 6 (o precedente).
Utilizzando un compilatore Java 7, quanto segue permette di compilare Java 6 bytecode compatibile:
javac -source 1.6 -target 1.6 MyJavaFile.java
Quando si tenta di compilare un 7 caratteristica del linguaggio Java (multi-catch, per esempio) si vuole ottenere:
roach$ javac -source 1.6 -target 1.6 test.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
test.java:9: error: multi-catch statement is not supported in -source 1.6
} catch (NullPointerException | BufferOverflowException ex) {}
^
(use -source 7 or higher to enable multi-catch statement)
1 error
1 warning
(per di più su ciò che warning
mezzi, vedi: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - non è relavent a questa discussione)
Se si modifica il flag -source
-1.7
riceverà:
source release 1.7 requires target release 1.7
Perché ... non è possibile compilare Java 7 fonte (ad esempio fonte che ha funzionalità Java 7) al codice byte compatibile con Java 6.
Se si compila con Java 7 (senza -source
o -target
bandiera) si otterrà Java 7 bytecode che non può essere eseguito su un < Java 7 JVM. E se provi a farlo, riceverai un errore che ti dice che le versioni non corrispondono:
roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : Unsupported major.minor version 51.0
non puoi compilare il sorgente con Java 7 funzioni in Java 6 .class perché questo
javac -source 1.7 -target 1.6 Test.java
produce source release 1.7 requires target release 1.7
errore. Questo perché alcune delle funzionalità 1.7 possono funzionare solo con le classi Java 7. Ad esempio, try-with-resources
utilizza il metodo Throwable.addSuppressed
disponibile solo dal 1.7