Это (первая из ваших команд) не работает, потому что нет модуля с именем calc-module
. Имя модуля calc
, как указано в module-info.java
java -p out --add-modules calc-module com.ngsharma.ocp.Calculator <-- cannot work
Любой из этих двух будет работать для вас:
java -p out --add-modules calc com.ngsharma.ocp.Calculator
java -p out --module calc/com.ngsharma.ocp.Calculator
Компиляция
Непосредственный родительский каталог
Существует способ компилировать модулей легко , если имя каталога содержащегося модуля идентично названию модуля. Как и в этой структуре:
.
+-- src
+-- calc
+-- com
¦ +-- ngsharma
¦ +-- ocp
¦ +-- Calculator.java
+-- module-info.java
Теперь весь модуль может быть скомпилирован с использованием:
javac -d out --module-source-path src -m calc
Структура каталогов out будет автоматически иметь имя модуля и, следовательно, быть идентичным структуре sr c.
Эта команда не будет работать, если имя каталога не совпадает с именем модуля, и в в таком случае вы получите error: module calc not found in module source path
.
Нет никакой разницы в том, как работает программа. Это только допустимо для компиляции.
Не непосредственный родительский каталог
Использование --module-source-path
не требует, чтобы имя каталога идентично имя модуля является непосредственным родительским каталогом для вашего пакета. Вы также можете создать эту общую структуру, где имя модуля находится на root несколько каталогов вверх:
.
+-- calc
+-- src
+-- main
+-- java
+-- com
¦ +-- ngsharma
¦ +-- ocp
¦ +-- Calculator.java
+-- module-info.java
Однако вам необходимо настроить команду компиляции в этом случае (например, Stephan Herrmann объясняет в ответе на «Java 9 ошибка: нет в модуле по пути источника модуля» ):
javac -d out --module-source-path "./*/src/main/java/" -m calc
Обратите внимание, что не требуется что каталог разделяет имя с самим модулем. Это просто помогает структурировать вашу программу и упростить компиляцию.