Я сначала отвечу на ваш вопрос («Что такое автоматический модуль?»), Но я также объясню, для чего они нужны для. Трудно понять, почему автоматические модули ведут себя именно так, без этой информации.
Что такое автоматический модуль?
Модульная система создает модуль из каждого JAR, который она находит на пути к модулю. Для модульных JAR (то есть с дескрипторами модулей) это просто, поскольку они определяют свойства модуля (имя, требования, экспорт). Для простых файлов JAR (без дескриптора модуля) этот подход не работает, так что же должна делать модульная система вместо этого? Он автоматически создает модуль - автоматический модуль, так сказать - и принимает самые надежные предположения по трем свойствам.
Имя
Получение названия - это двухэтапный процесс:
- если JAR определяет заголовок
Automatic-Module-Name
в своем манифесте, он определяет имя модуля
- в противном случае имя файла JAR используется для определения имени
Второй подход изначально нестабилен, поэтому не следует публиковать модули, зависящие от такого автоматического модуля. Maven предупреждает об этом.
Требует
Поскольку простой JAR выражает предложения, не требующие выполнения, система модулей позволяет автоматическим модулям читать все другие модули, которые попадают в график читабельности (также известный как график модулей). В отличие от явных модулей, автоматические также читают безымянный модуль, который содержит все, что было загружено из пути к классам. Эта, казалось бы, второстепенная деталь оказывается очень важной (см. Ниже).
Однако у автоматических модулей есть и другие особенности читабельности:
- Как только будет разрешен первый автоматический модуль, будут разрешены все остальные. Это означает, что как только на один простой JAR в пути к модулю ссылается другой модуль, все простые JAR загружаются как автоматические модули.
- Автоматические модули подразумевают удобочитаемость всех других автоматических модулей, что означает, что модуль читает один из них. , читает их все.
Взятые вместе, это может иметь неприятный эффект: явный модуль (т.е. неавтоматический), который зависит от нескольких простых JAR-файлов, может уйти, требуя только одного из них (при условии, что остальные также попадают в путь к модулю). .
Экспорт / Открытие
Поскольку JAR не содержит информации, какие пакеты считаются общедоступными API, а какие нет, модульная система экспортирует все пакеты, а также открывает их для глубокого размышления.
Более
Система модулей также сканирует META-INF/services
и заставляет автоматический модуль предоставлять указанные в нем услуги. Предполагается, что автоматическому модулю разрешено использовать все службы.
Наконец, запись манифеста Main-Class
также обрабатывается, поэтому простой JAR, определяющий ее, может быть запущен точно так же, как автоматический модуль, в котором основной класс был установлен с помощью инструмента jar
(т.е. java --module-path my-app.jar --module my.app
).
Правильный модуль
После создания автоматического модуля он обрабатывается как любой другой модуль. Это явно означает, что модульная система проверяет его как любой другой модуль, например, на наличие разделенных пакетов.
Что такое автоматический модуль для?
Одной из причин введения модулей было сделать компиляцию и запуск приложений более надежными и быстрее находить ошибки, что было возможно с помощью пути к классам. Важнейшим аспектом этого является requires
пунктов.
Чтобы обеспечить их надежность, объявление модуля не может требовать чего-либо, кроме именованного модуля, который исключает все загруженное из пути к классу. Если бы история на этом закончилась, модульный JAR мог бы зависеть только от других модульных JAR, что заставило бы экосистему модулироваться снизу вверх.
Однако это неприемлемо, поэтому автоматические модули были введены как средство для зависимости модульных JAR от немодульных, и все, что вам нужно для этого, - это разместить простой JAR на пути к модулю и потребовать его по имени модульная система. дает это.
Интересно то, что, поскольку автоматические модули читают безымянный модуль, возможно (и я обычно рекомендую это делать) оставить его зависимости на пути к классу. Таким образом, автоматические модули действуют как мост от модуля к пути к классу.
Ваши модули могут находиться на одной стороне, требуя своих прямых зависимостей в качестве автоматических модулей, а косвенные зависимости могут оставаться на другой стороне. Каждый раз, когда одна из ваших зависимостей превращается в явный модуль, она покидает мост на модульной стороне и рисует свои прямые зависимости в виде автоматических модулей на мосту.
person
Nicolai Parlog
schedule
14.10.2017