2013-06-18 15 views
8

Krótkie pytanie: Jeśli używam względnie "pomniejszych" funkcji języka Java 7 wcześniej niedostępnych w Javie 6, takich jak blok try-muticatch ... czy to oznacza, że ​​mój program nie działa na maszynach z JRE 6 lub JRE 5 zainstalowany po kompilacji, jak jest? Jeśli to prawda, czy istnieje szybki sposób na utworzenie pliku JRE6 .jar bez zmiany kodu źródłowego Java 7 (który, nawiasem mówiąc, jedyną dostępną funkcją Javy 7 jest blok try-multicatch)?JAVA 7 języków kompatybilność wsteczna

Odpowiedz

8

Masz rację. Multi-catch jest funkcją języka Java 7 i nie ma możliwości skompilowania go do kodu Java 6 (lub wcześniejszego) zgodnego z JVM.

Korzystanie z Java 7 kompilator dodaje pozwala skompilować Java 6 zgodnego kodu bajtowego:

javac -source 1.6 -target 1.6 MyJavaFile.java

Przy próbie kompilacji 7 funkcji języka Java (multi-zaczep, na przykład), który będzie otrzymujemy:

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 

(więcej informacji na temat co to warning środki, patrz: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - to nie relavent do tej dyskusji)

Jeśli zmienić flagę -source do 1.7 otrzymasz:

source release 1.7 requires target release 1.7

Bo ... nie można skompilować Java 7 źródła (np źródło, które ma funkcje Java 7) do kodu zgodnego z Java 6.

Jeśli skompilujesz go z Javą 7 (bez flagi -source lub -target) otrzymasz kod bajtowy Java 7, który nie może być uruchomiony na JVM Java 7 JVM <. Jeśli spróbujesz to zrobić, otrzymasz komunikat o błędzie informujący, że wersje się nie zgadzają:

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

cant skompilować źródła z Java 7 cech w Java 6 .class ponieważ

javac -source 1.7 -target 1.6 Test.java 

produkuje source release 1.7 requires target release 1.7 błąd. Dzieje się tak, ponieważ niektóre z 1.7 funkcji mogą działać tylko z klasami Java 7. Np. try-with-resources używa metody Throwable.addSuppressed dostępnej tylko od 1.7