module / requires / exports
Описание модуля в файле module-info.java: какие модули ему нужны и какие пакеты он открывает другим.
Доступно с: Java 9
Синтаксис
module name { requires other.module; exports some.package; }Примеры
Файл module-info.java в корне исходников:
// src/module-info.java
module com.shop.app {
requires java.net.http;
requires java.sql;
exports com.shop.api;
}Какому модулю принадлежит класс и какие пакеты модуль экспортирует:
void main() {
IO.println(String.class.getModule().getName());
Module sql = java.sql.Connection.class.getModule();
IO.println(sql.getName());
IO.println(sql.getDescriptor().exports().stream()
.map(ModuleDescriptor.Exports::source)
.sorted()
.toList());
IO.println(getClass().getModule().isNamed());
}Результат:
java.base
java.sql
[java.sql, javax.sql]
falseПримечания
requires подключает модуль, exports делает публичные классы пакета доступными другим модулям; неэкспортированные пакеты скрыты даже от public. requires transitive передаёт зависимость дальше, opens разрешает рефлексию (нужно фреймворкам вроде Spring и Jackson). Код без module-info.java попадает в безымянный модуль и видит всё — так работает большинство приложений и все примеры этого справочника. Модульный проект обычно собирает Maven или Gradle, а запускают его через путь модулей: java -p out -m com.shop.app/com.shop.app.Main.
См. также
- import / package — package задаёт пакет файла, import позволяет писать короткие имена классов из других пакетов.
- public / protected / private — Модификаторы доступа задают, откуда виден класс, поле, метод или конструктор.
- Object.getClass() — Возвращает класс объекта во время выполнения.
В учебнике
- Модули — Система модулей Java — module-info.java, requires и exports, проект из двух модулей, сборка javac --module-source-path и запуск java --module-path, модули самого JDK.