3

我是模块主题的新手,我正在关注如何创建、编译和运行它们的简单示例。

我的项目的文件夹结构如下图所示:

osfar的项目目录结构

首先我在一个 cmd 窗口中输入这个来编译 module-info.java 和 Task.java 文件:

javac --module-path mods -d feeding feeding/zoo/animal/feeding/Task.java feeding/module-info.java

然后我尝试使用以下代码运行代码:

java --module-path feeding --module zoo.animal.feeding/zoo.animal.feeding.Task

我收到以下错误:

Error occurred during initialization of boot layer
java.lang.module.FindException: Error reading module: feeding
Caused by: java.lang.module.InvalidModuleDescriptorException: Task.class found in top-level directory (unnamed package not allowed in module)

有人可以解决这个问题吗?另外,--module-path选项在javaandjavac命令中的作用是什么?

这是类和模块描述符的代码:

module zoo.animal.feeding {
}
public class Task {
    public static void main(String... args) {
        System.out.println("All fed!");
    }
}
4

1 回答 1

3

根据错误消息读取的内容非常简单地解决。

原因:java.lang.module.InvalidModuleDescriptorException:在顶级目录中找到Task.class(模块中不允许使用未命名的包)

使用模块路径,项目的顶级目录中不允许有一个类。所以根据目录结构,你的Task.java文件应该包括包描述,看起来像 -

package zoo.animal.feeding;
public class Task {
    public static void main(String... args) {
        System.out.println("All fed!");
    }
}

编译(来自所在的命令行目录modsfeeding将继续进行,例如:

javac -d mods feeding/module-info.java feeding/zoo/animal/feeding/Task.java

应该可以帮助您作为输出文件夹.class下的相应目录中的相关文件。mods然后您使用以下 java 命令的执行应该按预期工作。

java --module-path mods -m zoo.animal.feeding/zoo.animal.feeding.Task
于 2020-09-01T15:57:58.797 回答