59 lines
4.2 KiB
Markdown
59 lines
4.2 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
- модули
|
|||
|
- модуль
|
|||
|
- модулей
|
|||
|
- JPMS
|
|||
|
- модульную систему
|
|||
|
tags:
|
|||
|
- maturity/🌱
|
|||
|
date: 2024-10-15
|
|||
|
zero-link:
|
|||
|
parents:
|
|||
|
linked:
|
|||
|
---
|
|||
|
Модульная система Java (JPMS), представленная в [[../../../../knowledge/dev/java/Java 9|Java 9]], позволяет разработчикам разбивать приложения на логически обособленные блоки — модули.
|
|||
|
|
|||
|
> [!WARNING] Не Maven/Gradle модули
|
|||
|
> Модули в Maven и Gradle — это структурные единицы системы сборки, которые помогают управлять зависимостями и сборкой проекта, но они не являются модулями в контексте модульной системы Java (JPMS).
|
|||
|
|
|||
|
Модуль - это набор пакетов, содержащих типы (классы и интерфейсы) ресурсы и другие виды статической информации.
|
|||
|
|
|||
|
**Какие проблемы решает?**
|
|||
|
- Делает зависимости явными
|
|||
|
- Улучшает [[../architecture/Инкапсуляция|инкапсуляцию]], предотвращая создание нежелательных зависимостей между модулями. Все привыкли к модификаторам доступов у классов, но у пакетов модификаторов доступа не было.
|
|||
|
|
|||
|
Одним из ключевых преимуществ JPMS является чёткий контроль зависимостей. В старой системе через classpath все классы и пакеты были доступны друг другу без явного указания разрешений, что часто приводило к ошибкам и некорректному использованию библиотек. С JPMS разработчики могут точно указывать, какие зависимости нужны модулю и какие его части будут видимы другим модулям.
|
|||
|
## Дескриптор
|
|||
|
Каждый модуль имеет дескриптор - файл `module-info.java`, который содержит описание того, какие зависимости необходимы модулю и какие пакеты он экспортирует для других.
|
|||
|
|
|||
|
Дескриптор описывает:
|
|||
|
- Импортируемые, экспортируемые, транзитивно-экспортируемые пакеты.
|
|||
|
|
|||
|
Пример простого дескриптора:
|
|||
|
```java title=module-info.java
|
|||
|
module com.example.myapp {
|
|||
|
requires java.sql;
|
|||
|
exports com.example.myapp.service;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
В этом примере модуль `com.example.myapp` использует (`requires`) модуль `java.sql` и экспортирует (`exports`) пакет `com.example.myapp.service`, который может быть использован другими модулями. Все остальные пакеты, не указанные в директиве `exports`, остаются приватными и недоступными для других модулей.
|
|||
|
|
|||
|
> [!NOTE] Обратная совместимость
|
|||
|
> Модульная система разработана с учётом совместимости с предыдущими версиями JDK. Проекты, которые не перешли на JPMS, могут по-прежнему использовать старую систему через classpath.
|
|||
|
|
|||
|
***
|
|||
|
## Мета информация
|
|||
|
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
|||
|
**Родитель**:: [[../../../../knowledge/dev/java/Устройство Java|Устройство Java]]
|
|||
|
**Источник**::
|
|||
|
**Создана**:: [[2024-10-15]]
|
|||
|
**Автор**::
|
|||
|
### Дополнительные материалы
|
|||
|
-
|
|||
|
|
|||
|
### Дочерние заметки
|
|||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
|||
|
|