Какова ценность добавления немодульных jar-файлов в -classpath и модульных jar-файлов в --module-path при компиляции модуля?

Я видел, что в проекте с module-info.java maven добавляет модульные jar-файлы (содержащие module-info.class или свойство манифеста Automatic-Module-Name ) в --module-path, а остальные jar-файлы в -classpath.

Но spec гласит:

[...] Однако это не означает, что код в именованном модуле может обращаться к типам в безымянном модуле. Именованный модуль фактически не может даже объявлять зависимость от безымянного модуля. Это ограничение является преднамеренным[...]

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

Поскольку исходным кодам модульного проекта не разрешен доступ к типам из безымянного модуля, какова цель добавления каких-либо jar-файлов в -classpath в приведенном выше случае?


person Marinos An    schedule 07.07.2020    source источник


Ответы (1)


Это более тонко. Плагины Apache Maven, которым необходимо понимать путь к модулю, используют Плексус Java. Это может создать дерево всех необходимых модулей на основе дескрипторов модулей. Он понимает файл с информацией о модуле, Automatic-Module-Name, а также автоматические модули на основе имени файла. В идеале ничего не должно заканчиваться на пути к классам, это часто означает, что вы используете слишком много (транзитивных) зависимостей. Однако в некоторых случаях файлы jar не могут оказаться на пути к модулю (имя файла не может быть преобразовано в имя модуля, конфликты имен файлов), поэтому вам нужны другие приемы. https://openjdk.java.net/jeps/261 показывает список дополнительных аргументов, которые вы может обеспечить взаимодействие между пути к модулю и пути к классам/файлам.

Я мог бы выбрать простое решение (поместить все в путь к модулям, пусть javac/java решит, что ему нужно), однако для Maven я решил выбрать чистый путь к модулям: помещать только jar-файлы в путь к модулям, которые действительно используются . Остальное попадает в путь к классам.

person Robert Scholte    schedule 07.07.2020
comment
Теперь более понятно. Я думаю, что я что-то пропустил изначально, что я вижу сейчас. Зависимости, которые не требуются в module-info, попадают в -classpath. Это происходит даже для именованных модулей (содержащих module-info внутри). Это верно? Если да, то мой вопрос в заголовке сформулирован неправильно. - person Marinos An; 08.07.2020
comment
Не совсем, важным кодом для этого является github.com/codehaus-plexus/plexus-languages/blob/master/ . Здесь jar передается в JDK, чтобы получить имя модуля, поэтому он ведет себя на 100% одинаково. - person Robert Scholte; 14.07.2020
comment
Полезно знать эту часть. Для справки, я также добавил тестовый код, который привел меня к приведенному выше выводу: repl.it/@stackit/module-inclasspath-test1#README.md - person Marinos An; 14.07.2020