) и не объявляет экспортируемые или открытые пакеты. Автоматические модули получают специальную обработку во время разрешения, чтобы они считывали все остальные модули в конфигурации. Когда автоматический модуль создается на виртуальной машине Java, он читает каждый безымянный модуль и обрабатывается так, как если бы все пакеты были экспортированы и открыты.

атические модули упоминаются много раз в stackoverflow, но я не смог найти полное, краткое и самодостаточное определение автоматического модуля.

Итак, что такое автоматический модуль? Экспортирует ли он все пакеты? Открывает ли он все пакеты? Читает ли он все остальные модули?

Ответы на вопрос(3)

похоже, правы насчет отсутствующего полного определения, поскольку я не нашел его в спецификации языка или JVM)

Javadocs предоставляют много формальных определений, хотя вjava.lang.module Пакетные занятия.

Частичная цитата изhttps://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleFinder.html#automatic-modules:

Файл JAR, который не имеетmodule-info.class в своем каталоге верхнего уровня определяетавтоматический модуль, следующее:

Если файл JAR имеет атрибутAutomatic-Module-Name"в его главном манифесте тогда его значением является имя модуля. В противном случае имя модуля происходит от имени файла JAR.

...

И изhttps://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleDescriptor.html:

Дескриптор модуля для автоматического модуля не объявляет никаких зависимостей (кроме обязательной зависимости отjava.base) и не объявляет экспортируемые или открытые пакеты. Автоматические модули получают специальную обработку во время разрешения, чтобы они считывали все остальные модули в конфигурации. Когда автоматический модуль создается на виртуальной машине Java, он читает каждый безымянный модуль и обрабатывается так, как если бы все пакеты были экспортированы и открыты.

автоматический модуль является именованным модулем, который определяется неявно, так как онне имеет объявления модуля, Обычный именованный модуль, напротив, определяется явно, с объявлением модуля; впредь мы будем называть тех, ктоявные модули.

Основное преимущество их использования заключается в том, что они позволяют обрабатывать артефакт как модуль при компиляции или запуске, не дожидаясь его переноса в модульную структуру.

Имя модуля автоматического модуля получено из файла JAR, используемого для включения артефакта, если он имеет атрибутАвтоматическое-Module-Name в основной записи манифеста. В противном случае имя модуля выводится из имени файла JARModuleFinder.

Исходя из того факта, что автоматический модуль не имеет декларации модуля, практически невозможно определить, какие все модули или пакеты он читает, открывает или экспортирует.

➜ Таким образом, поскольку нет явных экспортов / открытий для пакетов, находящихся в автоматическом модуле, описывается как -

... нет практического способа сказать, какие из пакетов в автоматическом модуле предназначены для использования другими модулями или классами, которые все еще находятся на пути к классам.Поэтому каждый пакет в автоматическом модуле считается экспортируемым, даже если он фактически предназначен только для внутреннего использования.

Further Цитировать ссылку дальше -

... нет практического способа заранее определить, от каких других модулей может зависеть автоматический модуль. После того, как граф модуля разрешен, следовательно,автоматический модуль предназначен для чтения любого другого названного модуля, будь то автоматический или явный.

Один изпредложения - Автоматический модуль предлагает традиционный уровень инкапсуляции:Все пакеты обаоткрыт для глубокого рефлексивного доступа а такжеэкспортируется для обычного доступа во время компиляции и во время выполнения к их публичным типам.

➜ Дополнительно, автоматический модуль

грантыподразумеваемая читаемость для всех других автоматических модулей

по той причине, что при использовании нескольких автоматических модулей в модуле его

... невозможно определить, содержит ли один из экспортируемых пакетов в автоматическом модуле (x.y.z) тип, сигнатура которого относится к типу, определенному в каком-либо другом автоматическом модуле (a.b.c).

 ZhekaKozlov14 окт. 2017 г., 09:22
Экспортирует ли он все пакеты? Открывает ли он все пакеты? Читает ли он все остальные модули?
Решение Вопроса

модуль?»), Но я также объясняю, что они там есть.за, Трудно понять, почему автоматические модули ведут себя так же, как и без этой информации.

Что такое автоматический модуль?

Система модулей создает модуль из каждого 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 в путь к модулю и требовать его по имени системы модулей. дает это.

Интересным моментом является то, что поскольку автоматические модули читают безымянный модуль, возможно (и я обычно рекомендую это делать) оставить свои зависимости на пути к классам. Таким образом, автоматические модули действуют как мост от модуля к пути класса.

Ваши модули могут находиться на одной стороне, требовать их прямых зависимостей в качестве автоматических модулей, а косвенные зависимости могут оставаться на другой стороне. Каждый раз, когда одна из ваших зависимостей превращается в явный модуль, она оставляет мост на модульной стороне и выводит свои прямые зависимости как автоматические модули на мост.

 manouti14 окт. 2017 г., 15:20
Отличный ответ, очень информативный!
 Nicolai27 мая 2018 г., 22:03
Включено это подПравильный модуль.
 ZhekaKozlov25 мая 2018 г., 11:17
Вы знаете, запрещают ли автоматические модули разделять пакеты или нет? Я думаю, что это стоит упомянуть в ответе.
 JMess25 янв. 2018 г., 18:41
Это ТАК вопрос дает некоторую полезную информацию относительно фактической настройки вашего проекта для использования автоматического модуля.

Ваш ответ на вопрос