Переход на модули
Автоматические и безымянные модули
«Переход на модули» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Модулизация существующего кода
Немногие проекты используют модули с самого начала. JPMS разработан для постепенной миграции, позволяя пути классов и пути модулей сосуществовать.
Ключевую роль играют автоматические модули и безымянный модуль.
Безымянный модуль
Всё, что загружено из пути классов, находится в едином безымянном модуле. Он читает все остальные модули и раскрывает все свои пакеты.
Это мост, благодаря которому устаревший код пути классов продолжает работать.
Именованный модуль не может читать безымянный
Ключевое правило: явный именованный модуль не может зависеть от безымянного модуля. Нельзя записать requires для кода из пути классов.
Поэтому выполняйте миграцию снизу вверх: сначала преобразуйте представление зависимостей.
Автоматические модули
Поместите обычный немодульный JAR в путь модулей, и он станет автоматическим модулем. Он получит автоматически выведенное имя, будет читать все остальные модули и раскроет все свои пакеты.
Это позволяет именованным модулям использовать requires для JAR, в котором ещё нет module-info.
Откуда берётся имя
Имя автоматического модуля выводится в следующем порядке предпочтения:
- Запись
Automatic-Module-Nameв манифесте JAR, если она присутствует - Иначе из имени файла JAR: версия удаляется, а дефисы заменяются точками
Важность стабильных имён
Разработчикам библиотек следует добавить Automatic-Module-Name в манифест до полной модулизации. Это гарантирует стабильное имя модуля, поэтому последующие объявления зависимостей сохранятся при появлении настоящего module-info.
Automatic-Module-Name: com.example.jsonСтратегия сверху вниз
Рекомендуемый подход для вашего приложения:
- Оставьте зависимости автоматическими модулями в пути модулей
- Сначала добавьте
module-info.javaв главный модуль приложения - Объявите зависимости от имён этих автоматических модулей
Пример шага миграции
Предположим, что guava-32.jar находится в пути модулей как автоматический модуль com.google.common. Ваш модуль приложения уже может объявить зависимость от него.
module com.example.app {
requires com.google.common;
exports com.example.app.api;
}Проблема разделённых пакетов
Модульная система запрещает двум модулям содержать один и тот же пакет. Старые библиотеки, разделяющие пакет между несколькими JAR-файлами, вызывают ошибки.
Исправьте это, объединив JAR-файлы, используя --patch-module или обновив версии, устраняющие разделение.
Проблемы доступа при отражении
Фреймворки, выполняющие глубокое отражение, могут завершиться ошибкой InaccessibleObjectException после модулизации. Добавьте директивы opens или, как временный мост, используйте флаг запуска --add-opens.
Полезный инструмент анализа зависимостей
Инструмент jdeps анализирует ваши JAR-файлы, сообщает о зависимостях, выявляет использование внутренних программных интерфейсов JDK и даже может создать предварительный вариант module-info.java с помощью jdeps --generate-module-info.
Сначала запустите его, чтобы спланировать миграцию.
Быстрая проверка
Вспомните, как обычный JAR получает идентичность модуля.
Итоги
Вы изучили методы миграции:
- Код пути классов находится в безымянном модуле; именованные модули не могут объявлять зависимость от него
- Обычные JAR-файлы в пути модулей становятся автоматическими модулями
- Задавайте
Automatic-Module-Nameдля стабильных имён - Следите за разделёнными пакетами и доступом при отражении; используйте
jdepsдля планирования
На этом курс JPMS завершён.
Часто задаваемые вопросы
Урок «Переход на модули» бесплатный?
Да — полный текст урока «Переход на модули» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Переход на модули»?
Автоматические и безымянные модули Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Переход на модули»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- module-info.java
- requires и exports
- Сервисы с provides/uses
- Переход на модули