С выходом Java 9 модуль стал принципиально новой концепцией в языке Java. Модуль как единица развертывания приложений и управления зависимостями имеет семантическое значение для среды выполнения. До появления модулей в Java были характерные проблемы:

  • Файлы JAR невидимы для среды выполнения: фактически они представляют собой архивированные каталоги с файлами классов.
  • Пакеты — это просто пространства имен, которые группируют классы для управления доступом.
  • Зависимости определяются только на уровне класса.
  • Управление доступом в сочетании с рефлексией порождает открытую по своей сути систему, где у единиц развертывания нет четких границ, а вся конструкция недостаточно хорошо контролируется.

С модулями многое меняется:

  • Определяются зависимости между модулями, чтобы все проблемы с разрешением и компоновкой можно было обнаружить при компиляции или при запуске приложения.
  • Модули обеспечивают корректную инкапсуляцию, которая защищает внутренние пакеты и классы от дотошных пользователей, желающих покопаться в них.
  • Каждый модуль — это полноценная единица развертывания с метаданными, которые современная среда выполнения Java умеет воспринимать и потреблять и которые отражаются в системе типов Java (например, с помощью рефлексии).

Платформенные модули Java воплощают «недостающее звено», которого не хватало в мире Java до версии 8 включительно.

Система модулей создавалась для того, чтобы единицы развертывания (модули) как можно меньше зависели друг от друга. Основная идея состояла в том, чтобы модули можно было загружать и компоновать по отдельности, хотя на практике приложения могут зависеть от группы модулей, которые предоставляют смежную функциональность (например, средства безопасности).

Более подробно о модулях можно узнать: