当前位置: 首页 > 知识库问答 >
问题:

module-info.java在哪个目录下?

苍德寿
2023-03-14

从project Jigsaw的快速入门教程中,似乎module-info.java会转到一个带有模块名称的目录中,例如,对于包含类myclass的模块my.module:

bin/
    my.module/
        module-info.class
        my/
            module/
                MyClass.class

然后,仍然按照教程,在调用MyClass(假设它有方法)时,模块路径选项被赋予bin目录:

java -p path/to/bin -m my.module/my.module.MyClass

到目前为止,一切都很好。

java -p path/to/bin/my.module -m my.module/my.module.MyClass

我不明白为什么两者都起作用。

如果bin包含两个模块,则没有区别:如果两个目录都在模块路径中,第二个版本仍然可以工作(如果只有bin在模块路径中,它也可以工作,如教程中所述)。

现在,当我尝试使用Java9模块用Eclipse创建一个Maven项目时,module-info.Java位于src/man/Java目录中,Module-info.class位于target/classes目录中。因此,现在包含module-info.class文件的目录与模块的名称没有关系。

但是,在第一种情况下,当我编写java-p path/to/bin-m my.module/my.module.myclass时,这意味着Java将在模块路径的目录中查找目录。

我觉得我错过了一些重要的东西。对于Java在模块路径中的目录中查找模块的方式有明确的解释吗?什么真正指定了一个模块?(我的印象是:不是目录,只有模块-info.java)。

令我更加困惑的是:Oracle文档指出:

但显然这并不是全部,至少Eclipse不是如何使用这个选项的。

注意:我见过这个问题,但它并没有真正的帮助:一个答案说module-info.java放在src/java/中,另一个答案说它放在一个名称为模块名的目录中。显然两者都是正确的,但它们没有解释为什么,而且有一个明显的矛盾。

共有1个答案

施令秋
2023-03-14

来自java.lang.module.moduleFinder#of(path...)的文档:

返回一个模块查找器,该模块查找器通过搜索一系列目录和/或打包模块来定位文件系统上的模块。给定数组中的每个元素都是以下元素之一:

  1. 模块目录的路径。
  2. 分解模块的顶级目录的路径。
  3. 打包模块的路径。

>

  • 使用--module-path path/to/bin时,路径条目被视为模块目录。这是因为bin目录(即顶级目录)中没有module-info.class文件。

    • 据我所知,模块目录中的任何分解模块都不需要有一个名称与模块名称匹配的顶级目录。这只是一个惯例。换句话说,您可以将my.module目录重命名为任何您想要的目录;modulefinder只是查看目录,看看是否存在module-info.class文件。

    当您使用--module-path path/to/bin/my.module时,路径条目被视为分解模块。这是因为在my.module目录(即顶级目录)中存在一个module-info.class文件。

      null

  •  类似资料:
    • 大家好 php -m 显示结果里有 mylsqlnd 但是,ldd /usr/bin/php 显示结果里没有mysql ldconfig -v |grep mysql ldconfig -p |grep mysql 显示结果里也没有, extension_dir 里只有opcache.so 这是为什么呢?

    • 我给出作为输入文件,一些方法将使用它,但是现在我的reader方法无法检测该文件。 我要将文件放置在哪个目录中....我是否必须在中制定任何maven规范,以检测文件是否存在,并且他们必须读取该文件。

    • 因此,当我试图通过另一个类MainFX运行gui时,我遇到了一些错误(我将尝试解决这些错误,但这并不是这个问题的意义所在): 正是在这一点上,我尝试添加一个module-info.java,并解决了IntelliJ捕获的所有导入依赖项,添加了一些模块依赖项: 所以我的module-info.java不能编译,如果没有module-info.java文件,我就不能运行JavaFX,这可能在没有mod

    • 我正在学习JavaFx并尝试制作一个可重用的组件。该项目正在VSCode中开发。该项目非常简单,涉及启动器和可重用组件。我正在重构,当添加模块时,一切都停止了工作,我无法继续重构。 module-info中显示的错误是:< code>javafx.controls无法解析为模块。虽然很奇怪,但是如果我告诉Maven更新项目,在一些罕见的情况下,错误会告诉我模块是空的或者不存在。 源代码(实验分支)

    • 我刚开始使用Java16,似乎不明白为什么我不能访问资源文件。我进行了一些故障排除,以缩小范围,至少在我似乎有问题的地方。 我正在使用IntelliJ IDEA 2021.2构建#IU-212.4746.92 我创建了一个新项目,我选择了带有OpenJDK 16的JavaFX。 然后,它用三个主文件创建项目,一个应用程序类、一个控制器类和一个FXML文件。创建项目后,我进入POM文件,选择了Jav

    • 问题内容: 假设我有一个使用Maven 3和junit的Java项目。有和目录分别包含主要来源和测试来源(所有内容都是标准的)。 现在,我想将项目迁移到Java9。内容表示Java 9模块。有看大约是这样的: 如果测试代码本身需要怎么办?例如,添加对某些模块的依赖关系,该依赖关系仅用于测试,而对于生产代码则不需要。在这种情况下,我必须把以给模块不同的名称。这样,Maven似乎将主源和测试源视为不同