【问题标题】:module Directory or module file inside name should be same or not模块目录或模块文件内部名称应相同或不同
【发布时间】:2020-06-27 07:54:30
【问题描述】:

目录结构

.
├── 
│   └── 计算模块
│   ├── com
│   │   └── ngsharma
│   │   └── ocp
│   │   └── Calculator.class
│   └── module-info.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

模块计算{}

Calculator.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 内部文件名,并成功运行。如何..?为什么..?
模块文件名和模块文件夹名要一致,否则不编译运行是正确的。请任何人建议我并纠正我的错误。(模块中的新手)。

【问题讨论】:

  • “根据java Doc模块文件名和模块文件夹名应该相同”,请分享参考供您参考。
  • “根据”什么?这句话没有意义。除了那个“模块文件名”总是module-info.java(和module-info.class)。

标签: java java-9 java-module module-info module-path


【解决方案1】:

后面的命令

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

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

为了直接回答问题,没有要求将构建模块的目录命名为与模块名称相同。

【讨论】:

    【解决方案2】:

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

    但是,在这种情况下,您需要调整编译命令(正如Stephan Herrmannanswer to "Java 9 error: not in a module on the module source path" 中解释的那样):

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2020-04-04
      • 2017-02-24
      • 2015-01-30
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      相关资源
      最近更新 更多