2

目录结构

. 
├── out 
│ └── calc-module 
│ ├── com 
│ │ └── ngsharma 
│ │ └── ocp
│ │ └── Calculator.class
│ └── 模块信息类
└── src 
    └──计算器
        ├── com 
        │ └── ngsharma 
        │ └── ocp
        │ └── Calculator.java
        └── 模块信息.java

成功编译生成out/calc-module目录。

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

模块信息.java

模块计算{}

计算器.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 calc-module com.ngsharma.ocp.Calculator 当我使用这个命令时,它抛出异常FindException : Module calc-module not found。
根据1.模块内部名称和模块目录名称应该相同,其他抛出FindException。
2 java -p out --add-modules calc com.ngsharma.ocp.Calculator
但在这种情况下,我没有使用模块目录名,我只在文件名中使用了module-info.java,并成功运行。如何..?为什么..?
模块文件名和模块文件夹名称应该相同,否则无法编译和运行它是否正确。请任何人建议我并纠正我的错误。(模块中的新手)。

4

2 回答 2

1

这(您的第一个命令)不起作用,因为没有名为calc-module. 模块的名称calcmodule-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目录结构将自动具有模块的名称,因此与 src 结构相同。

如果目录名称与模块名称不同,此命令将不起作用,在这种情况下您将获得error: module calc not found in module source path.

程序的运行方式没有区别。这仅对编译有效。

不是直接父目录

的使用--module-source-path并不要求与模块名称相同的目录名称是您的包的直接父目录。您还可以创建这个通用结构,其中模块名称位于多个目录的根目录中:

.
+-- calc
    +-- src
        +-- main
            +-- java
                 +-- com
                 ¦    +-- ngsharma
                 ¦        +-- ocp
                 ¦            +-- Calculator.java
                 +-- module-info.java

但是,在这种情况下,您需要 tweek 编译命令(正如Stephan Herrmann在对“Java 9 错误:不在模块源路径上的模块中”的回答中解释的那样):

javac -d out --module-source-path "./*/src/main/java/" -m calc

请注意,不要求目录与模块本身共享名称。它只是有助于构建程序并使编译更容易。

于 2020-03-16T10:01:50.660 回答
0

后一个命令

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

工作因为--add-modules接受作为参数存在于模块路径out目录)上的模块的名称,在这种情况下是calc而不是module-info.java所在文件夹的名称。

要直接回答这个问题,不需要将构建模块的目录命名为与模块名称相同的目录。

于 2020-03-16T08:12:08.110 回答