Java 9
Java 9 — это версия платформы Java Standard Edition (Java SE), выпущенная 21 сентября 2017 года. Она стала первой крупной версией после Java 8, выпущенной в 2014 году, и ознаменовала переход на новый шестимесячный цикл релизов. Ключевыми нововведениями стали модульная система (Project Jigsaw), интерактивная среда JShell, а также ряд улучшений в API, производительности и безопасности.
История и предпосылки
Разработка Java 9 началась вскоре после выхода Java 8. Основной целью проекта было преодоление ограничений монолитной архитектуры Java Runtime Environment (JRE), которая включала все библиотеки и компоненты, даже если они не использовались конкретным приложением. Это приводило к избыточному потреблению памяти и затрудняло развертывание на встраиваемых устройствах и в облачных средах.
Первоначально выпуск был запланирован на 22 марта 2017 года, но из-за сложности реализации модульной системы и необходимости дополнительного тестирования дату несколько раз переносили. Финальный релиз состоялся 21 сентября 2017 года. Java 9 стала последней версией, поддерживающей операционную систему Windows XP (только 32-битную версию) и Windows Server 2008.
Модульная система (Project Jigsaw)
Центральным нововведением Java 9 стала модульная система, реализованная в рамках Project Jigsaw. Она ввела понятие модуля — логической группы пакетов и ресурсов, которая явно декларирует свои зависимости и экспортируемые API.
Основные концепции
- module-info.java — файл, размещаемый в корне модуля, в котором объявляются:
module— имя модуля.requires— зависимости от других модулей.exports— пакеты, доступные внешним модулям.opens— пакеты, открытые для рефлексии (например, для библиотек вроде Hibernate или Spring).provides/uses— декларация сервисов для реализации слабой связанности.- java.base — базовый модуль, от которого зависят все остальные. Он включает такие пакеты, как
java.lang,java.util,java.io,java.mathи другие.
Преимущества модульной системы
- Уменьшение размера JRE: разработчики могут создавать минимальные образы среды выполнения, включающие только необходимые модули, с помощью инструмента
jlink. - Улучшенная инкапсуляция: внутренние API, ранее доступные через рефлексию, теперь скрыты, если не объявлены явно.
- Более чёткая структура зависимостей: ошибки отсутствия или конфликта модулей выявляются на этапе компиляции, а не во время выполнения.
- Повышение безопасности: ограничение доступа к внутренним классам платформы снижает риски эксплуатации уязвимостей.
Критика и сложности
Модульная система вызвала значительные трудности при миграции существующих проектов. Многие библиотеки и фреймворки, использующие рефлексию для доступа к внутренним классам JDK (например, sun.misc.Unsafe), перестали работать без явного разрешения. Для обратной совместимости Java 9 включает параметр --add-opens, позволяющий открывать модули для рефлексии, но его использование усложняет конфигурацию. Также возникли проблемы с инструментами сборки (Maven, Gradle), которые потребовали адаптации для поддержки модулей.
JShell (интерактивная среда)
В Java 9 была добавлена утилита JShell (инструмент jshell), предоставляющая интерактивную среду для выполнения фрагментов кода Java. Она позволяет вводить выражения, объявления классов, методов и переменных, а также сразу получать результат, без необходимости компиляции и запуска полного приложения.
Возможности JShell
- Выполнение произвольных выражений (например,
System.out.println("Hello")). - Создание и изменение переменных, методов и классов на лету.
- Автодополнение кода.
- Импорт пакетов по умолчанию.
- Сохранение и загрузка сессий.
- Встроенная справка и документация.
JShell предназначен для обучения, быстрого прототипирования, отладки и тестирования небольших фрагментов кода. Он не заменяет полноценную среду разработки, но значительно упрощает эксперименты с новыми API.
Изменения в API и языке
Новые возможности языка
- Приватные методы в интерфейсах: интерфейсы могут содержать
privateиprivate staticметоды, что позволяет избежать дублирования кода вdefaultиstaticметодах. - Улучшенный оператор
try-with-resources: теперь можно использовать переменные, объявленные вне блокаtry, если они являютсяfinalили эффективноfinal.
Новые и улучшенные API
- HTTP/2 Client (инкубатор): новый клиент для HTTP/2 и WebSocket, реализованный в модуле
jdk.incubator.httpclient. Он поддерживает асинхронные запросы, мультиплексирование и потоковую передачу данных. В Java 11 этот API был стандартизирован. - Методы
of()в коллекциях: статические фабричные методыList.of(),Set.of(),Map.of()иMap.ofEntries()для создания неизменяемых коллекций с удобным синтаксисом. - Улучшения
StreamAPI: добавлены методыtakeWhile(),dropWhile(),iterate()с предикатом иofNullable(). Optional: методifPresentOrElse()иor().CompletableFuture: улучшена поддержка задержек и таймаутов.ProcessHandle: новый API для управления процессами операционной системы, позволяющий получать PID, информацию о родительском процессе, дочерних процессах и завершать процессы.StackWalker: API для обхода стека вызовов с фильтрацией и ленивой загрузкой, более эффективный, чемThread.getStackTrace().- Улучшения в
java.util.concurrent: новый классFlowдля поддержки Reactive Streams, а также улучшения вCompletableFutureиForkJoinPool.
Устаревшие и удалённые функции
- Удаление
AppletAPI: поддержка апплетов была объявлена устаревшей, а сам API удалён из JDK. - Удаление
Java Web Start: утилитаjavawsбыла удалена из JDK. - Устаревание
CORBA(Common Object Request Broker Architecture): модулиjava.corbaиjava.transactionбыли помечены как устаревшие и удалены в Java 11. - Удаление
NashornJavaScript Engine: в Java 9 он был помечен как устаревший, а в Java 15 удалён окончательно.
Инструментарий и сборка
jlink
Инструмент jlink позволяет создавать минимальные пользовательские образы JRE, содержащие только необходимые модули. Это особенно полезно для развертывания приложений на встраиваемых устройствах, в контейнерах и облачных средах, где важен малый размер образа.
jdeps
Утилита jdeps была улучшена для анализа зависимостей на уровне модулей. Она помогает выявить, какие модули JDK использует приложение, а также обнаружить скрытые зависимости от внутренних API.
Улучшения в javadoc
- Поддержка модулей: документация теперь генерируется с учётом модульной структуры.
- Поиск: добавлена возможность поиска по документации.
- HTML5: по умолчанию документация генерируется в формате HTML5.
Производительность и безопасность
- Улучшенный сборщик мусора G1: в Java 9 сборщик мусора G1 (Garbage-First) стал сборщиком по умолчанию, заменив Concurrent Mark Sweep (CMS). CMS был объявлен устаревшим и удалён в Java 14.
- Улучшения в компиляторе: добавлена поддержка многоуровневой компиляции для повышения производительности JIT-компилятора.
- Безопасность: усилены механизмы контроля доступа к внутренним API, улучшена поддержка криптографических алгоритмов (например, SHA-3).
Версии и поддержка
Java 9 была выпущена как краткосрочная версия с поддержкой до марта 2018 года. Она была быстро заменена Java 10 (март 2018 года) и Java 11 (сентябрь 2018 года), которая стала версией с долгосрочной поддержкой (LTS). Несмотря на короткий жизненный цикл, Java 9 заложила основу для модульной архитектуры, которая стала стандартом для всех последующих версий Java.
Источники
- Java Platform, Standard Edition (Java SE) 9 Specification — Oracle Corporation.
- «Java 9: The Big Picture» — Cay S. Horstmann, 2017.
- «Java 9 Modularity: Patterns and Practices for Developing Maintainable Applications» — Paul Bakker, Sander Mak, 2017.
- Официальная документация Oracle по Java SE 9 (Java Platform, Standard Edition Documentation).
- Release Notes for JDK 9 and JRE 9 — Oracle Corporation.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →