Каталог модуля или файл модуля внутри имени должны быть одинаковыми или нет - PullRequest
2 голосов
/ 16 марта 2020

Структура каталогов

<b>.</b>
├── <b>out</b>
│   └── <b>calc-module</b>
│       ├── <b>com</b>
│       │   └── <b>ngsharma</b>
│       │       └── <b>ocp</b>
│       │           └── Calculator.class
│       └── module-info.class
└── <b>src</b>
    └── <b>calculator</b>
        ├── <b>com</b>
        │   └── <b>ngsharma</b>
        │       └── <b>ocp</b>
        │           └── Calculator.java
        └── module-info.java

Успешно скомпилировать и сгенерировать каталог out / cal c -module .

javac -d out/calc-module src/calculator/module-info.java src/calculator/com/ngsharma/ocp/Calculator.java 

module-info. java

module calc {}

Калькулятор. java

package com.ngsharma.ocp;

public class Calculator {

    public static int add(int i1, int i2) { return i1 + i2; }

    public static void main(String[] args) {
        System.out.println(add(20,40));
    }
}

Когда я компилирую этот модуль в следующей команде.
1. java -p out --add-modules cal c -module com.ngsharma.ocp.Calculator Когда я использую эту команду, она выдает исключение FindException : Модуль cal c -модуль не найден.
В соответствии с 1. модулем, внутренним именем и именем каталога модуля должно быть одно и то же, кроме броска FindException.
2 java -p out --add-modules cal c com.ngsharma.ocp.Calculator
но в этой ситуации я не использую имя каталога модулей, я используя только module-info. java внутри имени файла, и успешно запустите. Как..? и почему..?
Имя файла модуля и имя папки модуля должны быть одинаковыми, в противном случае не компилируйте и не запускайте его корректно или нет. Пожалуйста, кто-нибудь предложит мне и исправит меня, в чем моя ошибка. (Newb ie в модуле).

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Это (первая из ваших команд) не работает, потому что нет модуля с именем 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

Обратите внимание, что не требуется что каталог разделяет имя с самим модулем. Это просто помогает структурировать вашу программу и упростить компиляцию.

0 голосов
/ 16 марта 2020

Последняя команда

java -p out --add-modules calc com.ngsharma.ocp.Calculator

работает, поскольку --add-modules принимает в качестве аргумента имена модулей, присутствующих в modulepath (out каталог), который в данном случае равен calc, а не имя папки, в которой находится module-info.java.

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

...