2013-06-18 18 views
8

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

8

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)

012.351.

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

7

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

Problemi correlati