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
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
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