Модульный Java-проект описывает зависимости дважды. Скрипт сборки говорит, какие артефакты скачать и на какой путь положить. module-info.java говорит, какие модули этот модуль requires. Ничто не заставляет эти списки совпадать, и они расходятся.
Отказы тут несимметричны. Модуль из requires, который сборка не поставляет, падает на компиляции с понятным сообщением. JAR, который сборка поставляет, но ни один requires не упоминает, просто недоступен вашему модулю, и компилятор так и пишет. Запутанный случай это зависимость без module-info.class. На пути модулей она становится автоматическим модулем, и имя берётся из записи Automatic-Module-Name в манифесте, если она есть, или выводится из имени JAR-файла, если её нет. Переименуйте файл, и имя, на которое указывает строка requires, может измениться.
Положите тот же JAR на путь классов, и он попадёт в безымянный модуль, от которого именованный модуль вообще не может зависеть.
Так что для меня скрипт сборки это источник правды о том, что существует, а module-info.java это заявление о том, к чему мне можно прикасаться. Разные задачи. Кто-нибудь вообще сверяет одно с другим без плагина?