Вот что меня смущает!

жно ли иметь 2 модуля с одинаковым именем (но с немного отличным содержимым) в пути модуля?

Насколько я могу судить, компилятор Java 9 не жалуется на это. У меня есть 2 модуля, объявленные следующим образом:

module com.dj.helper {
    exports com.dj.helper;
}

Оба содержатcom.dj.helper пакет, но внутри пакета содержимое отличается. Затем в моем основном приложении я хочу импортировать этот модуль:

module com.dj {
    requires com.dj.helper;
}

Оба модуля с одинаковыми именами находятся на пути к моим модулям.

Я надеялся, что при компиляцииcom.dj модуль, который компилятор будет жаловаться на один и тот же модуль, существующий дважды, но это не так. Означает ли это, что на пути к модулю у вас может быть 2 версии одного и того же jar, а Java не будет знать, какой из них использовать?

Ответы на вопрос(2)

нет

пути к модулю. Официальная документация не ставит эту информацию на видное место - этоJavadoc ofModuleFinder::of это отдает это:

Это ошибка, если каталог содержит более одного модуля с одинаковым именем.

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

jar --create
    --file mods/monitor.observer.beta-1.0.jar
    --module-version 1.0
    -C classes/monitor.observer.beta .
jar --create
    --file mods/monitor.observer.beta-2.0.jar
    --module-version 2.0
    -C classes/monitor.observer.beta .

... и затем ссылки на папку в следующей компиляции ...

javac
    --module-path mods
    -d classes/monitor.statistics
    $(find monitor.statistics -name '*.java')

... что, как ожидается, приводит к следующему сообщению об ошибке:

error: duplicate module on application module path
module in monitor.observer.beta
1 error

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

да

Система модулей обеспечивает только уникальностьв каталоги. Еще раз изModuleFinder::of (выделение мое):

Модуль поиска модулей находит модули путем поиска в каждом каталоге, разобранном модуле или упакованном модуле в порядке индексации массива. Находит первое вхождение модуля с заданным именем иигнорирует другие модули с таким именем, которые появляются позже в последовательности.

Это позволяет иметь один и тот же модуль в разных каталогах.

 Nicolai05 окт. 2017 г., 08:02
@manouti О, ты абсолютно прав! Я забыл об этом. Обновлю ответ.
 DJ18005 окт. 2017 г., 14:18
Вот что меня смущает!
 Nicolai05 окт. 2017 г., 08:02
@ DJ180 Самое интересное, что он безубыточен даже без этой зависимости.
 DJ18004 окт. 2017 г., 23:35
Разве ваш модуль monitor.statistics не должен зависеть от monitor.observer.beta?
 manouti04 окт. 2017 г., 23:15
Может ли быть так, что ограничение распространяется только на одни и те же модули только в одном каталоге? Вот как я понял спецификацию как в JEP, так и на странице, на которую вы ссылались.
Решение Вопроса

JEP 261 модуля системы описывает путь модуля следующим образом:

Путь к модулю - это последовательность, каждый элемент которой являетсяопределение модуля или каталог, содержащий определения модуля. Каждое определение модуля является либо

A модульный артефактто есть модульный JAR-файл или JMOD-файл, содержащий определение скомпилированного модуля, или

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

Затем описывается механизм разрешения модуля:

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

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

 DJ18004 окт. 2017 г., 23:33
Что подразумевается под каталогом в контексте файла JAR? Я думаю, что эта строка говорит: «модульная система берет первое определение модуля с таким именем». Конечно, это означает, что у нас все еще может быть много проблем пути к классам во время выполнения?
 manouti05 окт. 2017 г., 09:28
@ DJ180 Каталог, указанный в спецификации, является каталогом, содержащим определения модулей (то есть модульный Jar, или разобранный каталог, содержащий файл определения модуля и пакеты). Мне остается неясным, вызовет ли это проблемы во время выполнения (я еще не экспериментировал с такими случаями).

Ваш ответ на вопрос