С выходом Java 9 модуль стал принципиально новой концепцией в языке Java. Модуль как единица развертывания приложений и управления зависимостями имеет семантическое значение для среды выполнения. До появления модулей в Java были характерные проблемы:
- Файлы JAR невидимы для среды выполнения: фактически они представляют собой архивированные каталоги с файлами классов.
- Пакеты — это просто пространства имен, которые группируют классы для управления доступом.
- Зависимости определяются только на уровне класса.
- Управление доступом в сочетании с рефлексией порождает открытую по своей сути систему, где у единиц развертывания нет четких границ, а вся конструкция недостаточно хорошо контролируется.
С модулями многое меняется:
- Определяются зависимости между модулями, чтобы все проблемы с разрешением и компоновкой можно было обнаружить при компиляции или при запуске приложения.
- Модули обеспечивают корректную инкапсуляцию, которая защищает внутренние пакеты и классы от дотошных пользователей, желающих покопаться в них.
- Каждый модуль — это полноценная единица развертывания с метаданными, которые современная среда выполнения Java умеет воспринимать и потреблять и которые отражаются в системе типов Java (например, с помощью рефлексии).
Платформенные модули Java воплощают «недостающее звено», которого не хватало в мире Java до версии 8 включительно.
Система модулей создавалась для того, чтобы единицы развертывания (модули) как можно меньше зависели друг от друга. Основная идея состояла в том, чтобы модули можно было загружать и компоновать по отдельности, хотя на практике приложения могут зависеть от группы модулей, которые предоставляют смежную функциональность (например, средства безопасности).
Более подробно о модулях можно узнать:
- из книги “Система модулей Java”
- статьи на Хабре: https://habr.com/ru/companies/piter/articles/527890/
- статья на Вики (EN): https://en.wikipedia.org/wiki/Java_Platform_Module_System