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
- 1. Silverlight 5 Kompatybilność wsteczna
- 2. Kompatybilność wsteczna OpenGL
- 3. Jak ważna jest kompatybilność wsteczna?
- 4. Grails 1.3.7/Java 7 Kompatybilność
- 5. Kompatybilność wsteczna .NET Compact 3.5 i 2.0
- 6. Interfejsy API iOS 6 i kompatybilność wsteczna
- 7. Kompatybilność wsteczna dla Angular UI Bootstrap 0.14.0
- 8. Kompatybilność wsteczna programu SQL Server w Entity Framework?
- 9. Kompatybilność wsteczna Mac OS X 10.6 i 10.7 podczas korzystania z NSPopovers
- 10. Znajomość kodu, inżynieria wsteczna, najlepsze koncepcje i narzędzia. Java
- 11. Zgodność wsteczna systemu Windows 10 Uniwersalna aplikacja
- 12. Protobuf-net enum zgodność wsteczna
- 13. Java 7 - ciągi wielowierszowe
- 14. języków statycznych i Reflection
- 15. Silna kryptografia Java SE dla Java 7?
- 16. Java 8 performance VS. Java 7
- 17. Wiele języków IDE
- 18. jQuery .prop() Kompatybilność
- 19. IE i Socket.io kompatybilność
- 20. Swift 4 kompatybilność wsteczną
- 21. Kompatybilność ARC i scenorysu
- 22. Struct kompatybilność wskaźnik
- 23. Kompatybilność przeglądarki konstruktorów Blob
- 24. setDragImage nie działa - Java 7
- 25. Uwalnianie zasobów Java 7 WatchService
- 26. Java 7 Date/Time API
- 27. Java 7 ATOMIC_MOVE podaje wyjątki
- 28. Diament Nie kompilując Java 7
- 29. Jaki jest termin techniczny dla języków C# lub Java?
- 30. Inżynieria wsteczna Apple Kext - rekonstrukcja klasy