Краткий вопрос: если я использую относительно «второстепенные» языковые функции Java 7, ранее недоступные в Java 6, такие как блок try-muticatch ... это означает, что моя программа не будет работать на машинах с JRE 6 или JRE 5, установленными после компиляции как есть? Если это правильно, есть ли быстрый способ создать исполняемый файл JRE6 .jar без изменения исходного кода Java 7 (который, кстати, единственная функция Java 7, которую он будет использовать, представляет собой блок try-multicatch)?java 7 language обратная совместимость
ответ
Вы верны. Multi-catch - это языковая функция Java 7, и нет возможности скомпилировать ее на Java 6 (или более раннем) JVM-совместимом байт-коде.
Использование Java 7 компилятора, следующий позволяет компилировать Java 6 совместимые байты-код:
javac -source 1.6 -target 1.6 MyJavaFile.java
При попытке скомпилировать Java 7 особенности языка (мульти-улов, например) вы будете получить:
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
(более подробно о том, что warning
средства, см: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - это не relavent к этому обсуждению)
Если изменить -source
флаг 1.7
вы получите:
source release 1.7 requires target release 1.7
Потому что ... вы не можете скомпилировать Java 7 источника (например, источник с функциями Java 7) на совместимый с Java 6 байт-код.
Если вы скомпилировать его с Java 7 (без какого-либо -source
или -target
флага), вы получите Java 7 байт-код, который не может быть запущен на < Java-JVM. И если вы попытаетесь это сделать, вы получите сообщение о том, что версии не совпадают:
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
вы не можете скомпилировать источник с Java 7 функций в Java 6 .class, потому что это
javac -source 1.7 -target 1.6 Test.java
source release 1.7 requires target release 1.7
производит ошибку. Это связано с тем, что некоторые из 1.7 функций могут работать только с классами Java 7. Например, try-with-resources
использует Throwable.addSuppressed
метод доступен только с 1.7
- 1. Java 7 FileSystemProvider обратная совместимость
- 2. Java обратная совместимость описание
- 3. UISplitViewController iOS 7 Обратная совместимость
- 4. Java обратная совместимость не работает
- 5. JAXB обратная совместимость
- 6. Совместимость с Simulink обратная совместимость
- 7. Обратная совместимость лямбда-выражений?
- 8. Обратная совместимость с JSON
- 9. JBoss 5 Обратная совместимость с Java 6
- 10. Java 6 Исходная обратная совместимость и SQL
- 11. Правильная обратная совместимость, java.lang.VerifyError
- 12. layout_alignParentEnd и обратная совместимость
- 13. Spring 4.0.0 обратная совместимость
- 14. Обратная совместимость LinearLayout constructor
- 15. DirectX обратная совместимость
- 16. Eigen 3 - Обратная совместимость
- 17. Git repository обратная совместимость
- 18. GcmListenerService обратная совместимость
- 19. анзибль 2,2 обратная совместимость
- 20. Насколько важна обратная совместимость?
- 21. Обратная совместимость Xcode OSX
- 22. Обратная совместимость Конструкция материала
- 23. HTML5 Анимация - обратная совместимость
- 24. Объект/XML обратная совместимость
- 25. UWP MediaPlayerElement Обратная совместимость
- 26. Обратная совместимость onBackPressed
- 27. Осколки Android обратная совместимость
- 28. MSVCRT обратная совместимость?
- 29. Xcode обратная совместимость
- 30. Обратная совместимость в Sencha