Когда вы запускаете приложение Java с помощью команды --module
, передаваемое значение является «корневым» модулем. То же самое относится и к модулям, добавленным через --add-modules
. Система модулей определяет весь граф модулей из этих корневых модулей. Другими словами, он читает файл module-info
, находит директивы requires
и затем ищет путь к модулю для этих требуемых модулей. Это делает это транзитивно. Некоторые модули также объявляют одну или несколько директив uses
для службы. Любые модули на модульном пути, которые provides
любой из этих служб также будут загружены, независимо от того, есть ли у любого модуля requires
их.
Это означает, что если на модульном пути есть модуль, который не требуется ни одному загруженному модулю и не предоставляет никаких услуг, необходимых любому загруженному модулю, то указанный модуль не будет загружен. Если вам интересно узнать, какие модули разрешены, вы можете использовать следующую команду:
java --show-module-resolution --dry-run -p [MODULEPATH] -m [MODULE]
В вашем случае я могу только предположить, что ни один из ваших других модулей не требует modularX
, поэтому, когда он находится на modulepath , он не загружается. Однако, когда он находится в classpath , все работает по-другому, и это обнаруживается вашим немодулярным кодом, который также находится в classpath. Вы все еще можете использовать modulepath, просто убедитесь, что ваш модуль moduleX
загружен. Это может быть вызвано с помощью --add-modules
:
java -p moduleA.jar;automod.jar;moduleX.jar --add-modules moduleX -cp nonmodular.jar -m moduleA/modA.A
Обратите внимание, что вы также можете ограничить модули с помощью --limit-modules
.