Что такое модули в Java (JPMS) и являются ли они частью одного проекта?

«Что такое модули в Java (JPMS) и являются ли они частью одного проекта?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модули в Java — это функциональные единицы инкапсуляции, введенные Java Platform Module System (JPMS) в Java 9. Они описываются файлом module-info.java и позволяют явно декларировать зависимости (requires) и публичный API (exports).

Являются ли модули частью одного проекта? Да, модули обычно являются частью одного проекта, но они организуют его код в логически изолированные компоненты с четкими границами. Однако модуль также может быть самостоятельной библиотекой, используемой в разных проектах.

Цели модулей:

  • Надежная инкапсуляция: Скрытие внутренних пакетов от внешнего мира.
  • Явное объявление зависимостей: Устранение проблем classpath.
  • Улучшение структуры приложения: Разделение на компоненты.

Пример структуры проекта с двумя модулями:

my-application/
├── module-a/
│   ├── src/main/java/
│   │   ├── com.example.a.internal/  // Внутренний, не экспортируемый пакет
│   │   ├── com.example.a.api/       // Публичный API
│   │   └── module-info.java
│   └── pom.xml (или build.gradle)
└── module-b/
    ├── src/main/java/
    │   ├── com.example.b/
    │   └── module-info.java
    └── pom.xml

Содержимое module-info.java:

// module-a/module-info.java
module com.example.module.a {
    exports com.example.a.api; // Только этот пакет виден извне
    // Пакет 'internal' скрыт
}

// module-b/module-info.java
module com.example.module.b {
    requires com.example.module.a; // Явная зависимость от модуля A
    // Теперь код в module-b может использовать только public-типы из com.example.a.api
}

Вывод: Модули — это способ организации кода внутри проекта в независимые, хорошо определенные компоненты с контролируемыми зависимостями, что упрощает сборку, тестирование и поддержку.