Что такое модуль

  • Поддерево пакетов
    • Управление зависимостями доступа
    • Сервисы
    • Контроль доступа

Определение модуля

  • Файл module-info.java
    • В пакете по умолчанию
  • Синтаксис
    • /** Javadoc */
      [@Annotations]
      [open] module имя.модуля {
          определения
      }
      

Module path

  • PATH-like список
    • Опция --module-path (-p)
  • Подкаталоги
    • Распакованные модули
  • Jar-файлы
    • Упакованные модули
    • Автоматические модули
  • Обратная совместимость
    • --add-module модуль – добавить системный модуль в CLASSPATH

Компиляция и запуск

  • Компиляция
    • javac
    • --module-path – откомпилированные зависимости
    • --module-source-path – зависимости в исходниках
  • Запуск
    • java
    • --module-path – откомпилированные зависимости
    • --module модуль/класс – что запускать

Управление зависимостями

Содержание

Подключение зависимостей

  • Синтаксис
    • requires [transitive] [static] имя.модуля;
      
    • transitive – наследуемая зависимость
    • static – времени компиляции
  • Примеры
    • module info.kgeorgiy.java.base {
          requires transitive junit;
      }
      
    • module info.kgeorgiy.java.implementor {
          requires java.compiler;
          requires info.kgeorgiy.java.base;
      }
      

Экспортирование пакетов

  • Доступны во время компиляции и исполнения
  • Синтаксис
    • exports имя.пакета [to модуль1, модуль2, ...];
      
    • По-умолчанию: всем
    • «Модули-друзья»
  • Пример
    • module info.kgeorgiy.java.base {
          exports info.kgeorgiy.java.base;
          exports info.kgeorgiy.java.base.test
              to info.kgeorgiy.java.test;
      }
      

Открытые пакеты

  • Полностью доступны для reflection
  • Синтаксис
    • opens имя.пакета [to модуль1, модуль2, ...];
      
    • По-умолчанию: всем
    • «Модули-друзья»
  • Пример
    • module info.kgeorgiy.java.base {
          opens info.kgeorgiy.java.base.opened;
          opens info.kgeorgiy.java.base.test
              to info.kgeorgiy.java.test;
      }
      

Сервис

  • Класс или интерфейс
  • Разные реализации
    • Независимые
    • Выбирается во время исполнения

Пример сервиса

  • Интерфейс
    • public interface HelloService {
          void sayHello(final String to);
      }
      
  • Реализации
    • public class HelloServiceEn implements HelloService {
          public void sayHello(final String to) {
              System.out.format("        Hello, %s%n", to);
          }
      }
      
    • public class HelloServiceFr {
          public static HelloService provider() {
              return to -> System.out.format("        Bonjour, %s%n", to);
          }
      }
      

Объявление реализаций сервисов

  • Синтаксис
    • provides имя.класса.сервиса
          with реализация.1[, реализация.2]*;
      
  • Пример
    • module i.k.j.helloModule {
          exports  i.k.j.helloModule.service;
          provides i.k.j.helloModule.service.HelloService with
                  i.k.j.helloModule.service.HelloServiceEn,
                  i.k.j.helloModule.service.HelloServiceFr;
      }
      

Объявление используемых сервисов

  • Все используемые сервисы должны быть объявлены
  • Синтаксис
    • uses имя.класса.сервиса;
      
  • Пример
    • module i.k.j.testModule {
          requires i.k.j.helloModule;
          uses i.k.j.helloModule.service.HelloService;
      }
      

Загрузчик сервисов

Пример загрузки сервисов

  • ServiceLoader<HelloService> loader
        = ServiceLoader.load(HelloService.class);
    for (HelloService service : loader) {
        service.sayHello("Main");
    }
    

Модуляризованный JDK

  • JDK 11 разбит на 73 модуля
    • Часть планируют удалить
    • java.* – основные
    • jdk.* – реализация
  • JDK 21 разбиты на 71 модуль (−6, +4)
  • Список модулей
    • java --module-path путь --list-modules
  • Информация о модуле
    • java --module-path путь --describe-module модуль

Специализация JDK

  • Содержит только необходимые модули
    • Не требует указания module-path
  • Сборщик jlink
    • jlink --module-path путь --add-modules module,module...

Обратная совместимость

Содержание

Взаимодействие с classpath

  • Безымянный модуль
    • Весь classpath
    • Доступ ко всем пользовательским модулям
  • Доступ к модулям JDK
    • --add-module module.name

Автоматические модули

  • Jar-файлы
    • На modulepath
    • Без module-info.class
  • Автоматическое имя
    • Генерируется по имени файла
    • hello-world-1.23.jarmodule hello.world
  • Через MANIFEST.MF
    • Атрибут Automatic-Module-Name

Управление зависимостями

  • Экспортирование
    • --add-exports <module>/<package>=<target-module>
  • Открытие
    • --add-opens <module>/<package>=<target-module>
  • Зависимости
    • --add-reads <module>=<target-module>
  • Изменение
    • --patch-module <module>=<file>

Ссылки

Вопросы

???