Что делает " обнаружены требуемые автомодули на основе имени файла."значит предупреждение?

в моем многомодульном проекте я создал module-info.java только для нескольких модулей. И во время компиляции с maven-compiler-plugin:3.7.0 Я получаю следующее предупреждение:

[предупреждение] * Обнаружены требуемые автомодули на основе файлов. Пожалуйста, не опубликуйте этот проект в общедоступном хранилище артефактов! *

что это значит? Это потому что у меня есть только несколько модулей с module-info.java, а не весь проект?

3 ответов


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

явный модуль (т. е. с module-info.java) может получить доступ только к коду модулей, которые он требует (игнорируя подразумевает читабельность на мгновение). Это здорово, если все зависимости модульны, но что, если они не являются? Как ссылаться на банку, которая не является модульной?

автоматические модули ответ: любая банка, которая заканчивается на пути модуля, превращается в модуль. Если JAR не содержит модуля объявление, система модуля создает автоматический модуль со следующими свойствами:

  • выведенное имя (это важный бит здесь)
  • читает все другие модули
  • экспорт всех пакетов

Maven полагается на этот механизм, и как только вы создадите module-info.jar Он помещает все зависимости в путь модуля.

автоматическая имена

существует два способа вывода автоматического модуля имя:

  • запись в манифесте
  • угадайте из имени файла JAR

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

что это в смысле?

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

стабильный имена

так почему нестабильные имена такая проблема? Предположим, ваша библиотека публикуется с помощью requires guava и моя структура публикуется с requires com.google.guava. Теперь кто-то использует твою библиотеку с моей framework и вдруг им нужны модули гуавы и com.гуглить.гуава!--42--> на их пути модуля. Безболезненного решения этой проблемы нет, поэтому ее необходимо предотвратить!

как? Например, отговаривая разработчиков от публикации артефактов, зависящих от автоматических модулей на основе файлов.


[предупреждение] * обнаружены требуемые автомодули на основе имени файла. Пожалуйста, не опубликуйте этот проект в общедоступном хранилище артефактов! *

это потому, что у меня есть только несколько модулей с module-info.Java, а не весь проект?

нет, это не из-за нескольких модулей, перечисленных в module-info.java но порожденный maven-compiler-plugin для всех автоматические модули нашел в модуле диаграмма.


что это значит?

не публиковать текущий проект настаивается, вероятно, поскольку автоматические модули, как ожидается, будут преобразованы в именованные или явные модули их владельцами, а затем опубликованы в репозитории, что может привести к изменению их имени модуля. Кроме того, следует отметить, что в соответствии с документом о ходе работы Maven ~> Java+9+-+Jigsaw, они все еще не полностью готов с совместимыми версиями плагинов JDK9.


просто изобразить пример для такого случая использовать. Подумайте над этими строками ... --10-->

  • я опубликовал артефакт com-foo-bar:1.0.0-SNAPSHOT:jar.
  • еще один мой проект com-xyz:1.0.0 зависит от него.
  • в конечном итоге ваш проект полагается на com-foo-bar транзитивно через com-xyz
  • вы планируете распределить свой код и использовать что-то как

    module your.module {
        requires com.foo.bar;
        requires com.xyz;
    }
    

    (нужно укажите транзитивные зависимости в объявлениях модуля отдельно)

  • все работало нормально, но до поры до времени я решил распределить свои библиотеки.
  • Итак, первое, что я сделал имя Мое модули!
  • и я сделал что-то фантастическое, чтобы явно вызвать мои усилия так: -

    module modular.com.foo.bar {}
    
  • Я в конечном итоге нарушение код любой зависимой библиотеки и, в конечном счете, любой, который зависит от вашего модульным способом.

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


редактировать: из комментариев @khmarbaise

понятно, что люди будут хотите опубликовать в artifactories, но если они не знают о последствиях, вы будете избиты в Будущее за этим.

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

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


С maven-compiler-plugin v3.7.0 это информационное сообщение. Не знаю, почему ты воспринимаешь это как предупреждение...

вот что я получаю, когда я создаю свой проект на основе Java 10 с module-info.java:

[INFO] Required filename-based automodules detected. Please don't publish this project to a public artifact repository!