在尝试编译和运行Java示例模块时发生错误。

huangapple go评论67阅读模式
英文:

Error while trying to compile and run sample module in Java

问题

以下是您要翻译的内容:

我对模块的主题还不熟悉,正在按照一个简单的示例来学习如何创建、编译和运行它们。

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

(图片链接已省略)

首先,我在命令提示符窗口中键入以下内容,以编译 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

我得到了以下错误:

在引导层初始化期间发生错误
java.lang.module.FindException: 读取模块时出错:feeding
Caused by: java.lang.module.InvalidModuleDescriptorException: 在顶级目录中找到 Task.class(无法在模块中使用未命名包)

有人能解决这个问题吗?此外,javajavac 命令中的 --module-path 选项的作用是什么?

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

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

I'm new to the topic of modules, and I'm following a simple example of how to create, compile and run them.

The folder structure of my project is illustrated in the following diagram:

在尝试编译和运行Java示例模块时发生错误。

First I typed this in a cmd window to compile the module-info.java and Task.java files:

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

Then I tried to run the code with the following:

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

I get the following error:

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)

Can someone resolve this? Also, what is the role of the --module-path option in both the java and javac commands?

This is the code for the class and the module descriptor:

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

答案1

得分: 4

很容易根据错误消息的提示来解决问题。

> Caused by: 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

应该能够在mods文件夹下的相应目录中得到相关的 .class 文件作为输出。然后,使用以下java命令执行时应该会按预期工作。

java --module-path mods -m zoo.animal.feeding/zoo.animal.feeding.Task
英文:

It's pretty straight forward to solve as per what the error message reads.

> Caused by: java.lang.module.InvalidModuleDescriptorException:
> Task.class found in top-level directory (unnamed package not allowed
> in module)

Using the modulepath, a class is not allowed in the top-level directory of the project. So based on the directory structure, your Task.java file should include package description and look like -

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

The compilation(from the command line directory where mods and feeding reside) would continue such as:

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

should help you relevant .class files in the corresponding directories under mods as output folder. Then your execution using the following java command should work as expected.

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

huangapple
  • 本文由 发表于 2020年9月1日 20:11:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/63687412.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定