Почему модули Java Automatic не содержат открытого раздела - PullRequest
0 голосов
/ 14 ноября 2018

Существует механизм для преобразования обычного jar в автоматический модуль , начиная с , просто помещая его в modulepath вместо classpath. Автоматический модуль имеет следующие свойства:

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

Так что все пакеты внутри автоматического модуля доступны. Но если мы проверяем автоматический модуль с директивой --describe-module, то в выводе нет секции exports.

Например, автоматический модуль main

jar --file main.jar --describe-module
com.foo jar:file:///.../code/module/main.jar/!module-info.class
requires java.base mandated
contains com.foo

Почему нет раздела exports, если пакет com.foo все равно считается экспортируемым? Я нахожу это немного запутанным: --describe-module предполагает, что нет экспортируемых пакетов , но в то же время, main является автоматическим модулем, поэтому все экспортируется неявно .

1 Ответ

0 голосов
/ 14 ноября 2018

Я полагаю, что параметр командной строки --describe-module в инструменте jar предназначен только для описания сущности файла jar, если его явный модуль является полным дескриптором, а для автоматического модуля отображается только имя.

Цитирование по команде jar --help

Печать дескриптора модуля, или имя автоматического модуля


С другой стороны, если вы попытаетесь использовать jdeps для генерации module-info.java автоматического модуля на основе файла JAR, вы можете заметить, что такие экспорты пакетов действительно присутствуют в модуле.декларация.Скажем, например:

jdeps -verbose:class --generate-module-info ../Desktop  ~/.m2/repository/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar

пишет .../Desktop/org.apache.commons.lang3/module-info.java следующее

module org.apache.commons.lang3 {
    requires transitive java.desktop;

    exports org.apache.commons.lang3;
    exports org.apache.commons.lang3.arch;
    exports org.apache.commons.lang3.builder;
    exports org.apache.commons.lang3.concurrent;
    exports org.apache.commons.lang3.event;
    exports org.apache.commons.lang3.exception;
    exports org.apache.commons.lang3.math;
    exports org.apache.commons.lang3.mutable;
    exports org.apache.commons.lang3.reflect;
    exports org.apache.commons.lang3.text;
    exports org.apache.commons.lang3.text.translate;
    exports org.apache.commons.lang3.time;
    exports org.apache.commons.lang3.tuple;
}
...