Открыть сервис

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() для создания неизменяемых коллекций с удобным синтаксисом.
  • Улучшения Stream API: добавлены методы takeWhile(), dropWhile(), iterate() с предикатом и ofNullable().
  • Optional: метод ifPresentOrElse() и or().
  • CompletableFuture: улучшена поддержка задержек и таймаутов.
  • ProcessHandle: новый API для управления процессами операционной системы, позволяющий получать PID, информацию о родительском процессе, дочерних процессах и завершать процессы.
  • StackWalker: API для обхода стека вызовов с фильтрацией и ленивой загрузкой, более эффективный, чем Thread.getStackTrace().
  • Улучшения в java.util.concurrent: новый класс Flow для поддержки Reactive Streams, а также улучшения в CompletableFuture и ForkJoinPool.

Устаревшие и удалённые функции

  • Удаление Applet API: поддержка апплетов была объявлена устаревшей, а сам API удалён из JDK.
  • Удаление Java Web Start: утилита javaws была удалена из JDK.
  • Устаревание CORBA (Common Object Request Broker Architecture): модули java.corba и java.transaction были помечены как устаревшие и удалены в Java 11.
  • Удаление Nashorn JavaScript 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 →