使用包时获取 java.lang.ClassNotFoundException

Getting java.lang.ClassNotFoundException when using package

我有一个 java 文件 ComPac.java,其中包含以下代码:

package com;
public class ComPac{
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

文件位于路径:/home/ec2-user/java_c

为了编译这个文件,我 运行 javac Compac.java,生成了 class 文件。

现在轮到 运行 class 文件了。

所以我做了 java ComPac(下面的屏幕截图)

可以理解,我得到了错误 Error: Could not find or load main class ComPac. Caused by: java.lang.NoClassDefFoundError: com/ComPac (wrong name: ComPac). 我假设这是因为 java 文件中声明了包 com

所以我尝试了 java com.ComPac 并希望它能工作(下面的屏幕截图)。

但是我得到了错误:Error: Could not find or load main class com.ComPac. Caused by: java.lang.ClassNotFoundException: com.ComPac

那么我该如何运行呢?当涉及到 java 中的包时,运行ning 的逻辑究竟是什么?

Java 使用- openjdk version "11.0.8" 2020-07-14 LTS(AWS Corretto)

OS 使用- Amazon Linux 2

将 class 放入名为“com”的文件夹中

在 bash shell 然后是:

$ java com/ComPac

(来自包含“com”的文件夹,不在“com”内部)

如果您正在使用 Java 11 那么您不需要先编译 java 文件然后 运行 class 文件。您可以直接 运行 使用 java 文件

java .\test.java

test.java

package com;

public class test{
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

命令:

java .\test.java

输出:

Hello World

正确的做法如下:

javac -d . ComPac.java

开关 -d . 要求编​​译器将生成的 class 文件放在当前目录,因为 . 代表当前目录。只需使用命令 javac

即可了解有关开关的更多信息

现在,如果您在Mac/Unix中使用命令ls或在Windows中使用dir,您将看到一个目录,com已创建并且 ComPac.class 已放置在此目录中。为了执行 class,您现在可以使用以下命令:

java com.ComPac