Подтвердить что ты не робот

Как добавить "требует" для артефакта, имеющего "-" (дефис) в его имени

Я включил эти зависимости в свой Maven pom.xml:

 <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${httpclient.version}</version>
</dependency>

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
</dependency>

Я пытаюсь добавить эту зависимость в module-info.java следующим образом:

module io.github.wildcraft.restclient {
    requires httpcore; // no compilation problem
    requires httpclient; // no compilation problem
    requires commons-io; // shows compilation error
}

Для commons-io я получаю ошибку компиляции. Как я могу сделать эту работу?

4b9b3361

Ответ 1

Краткая версия

Используйте requires commons.io. (В общем, см. ответ nullpointer, как узнать имя модуля.)

Длинная версия

Так как commons-io.jar еще не модульно, вы создаете автоматический модуль, для которого система модулей должна иметь имя. Javadoc ModuleFinder описывает, как это происходит:

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

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

  • Версия и имя модуля [...] получены из имени файла JAR файла следующим образом:

    • [...]

    • Все небуквенные символы ([^ A-Za-z0-9]) в имени модуля заменяются точкой ( "." ), все повторяющиеся точки заменяются одной точкой, а все ведущие и конечные точки удаляются.

Последние две пули применяются к автоматическим модулям, которые не подготовлены для Java 9, например. до commons.io. В этом примере из того же Javadoc объясняется, что происходит в вашем случае:

  • В качестве примера, JAR файл с именем "foo-bar.jar" получит имя модуля "foo.bar" и никакой версии. JAR файл с именем "foo-bar-1.2.3-SNAPSHOT.jar" получит имя модуля "foo.bar" и "1.2.3-SNAPSHOT" в качестве версии.

Следовательно, requires commons.io должен работать.

Ответ 2

Добавление к более короткой версии ответа , предоставленного Николаем. Чтобы узнать имя модуля зависимостей (jar), используемых в вашем проекте, вы можете использовать инструмент jar из командной строки.

jar --file=<jar-file-path> --describe-module 

Поскольку они будут поняты как автоматический модуль инструментом, результат будет примерно таким: -

$ / jar --file=commons-lang3-3.6.jar --describe-module
No module descriptor found. Derived automatic module.

[email protected] automatic // this is what you need to use without the version

requires java.base mandated
contains org.apache.commons.lang3
contains org.apache.commons.lang3.arch
contains org.apache.commons.lang3.builder
contains org.apache.commons.lang3.concurrent
contains org.apache.commons.lang3.event
contains org.apache.commons.lang3.exception
contains org.apache.commons.lang3.math
contains org.apache.commons.lang3.mutable
contains org.apache.commons.lang3.reflect
contains org.apache.commons.lang3.text
contains org.apache.commons.lang3.text.translate
contains org.apache.commons.lang3.time
contains org.apache.commons.lang3.tuple