Java: Error: Could not find or load main class Hello when trying to import an external library

Java: Error: Could not find or load main class Hello when trying to import an external library

我知道这是一个常见问题,但我已阅读所有其他答案,但找不到解决方案。我试图理解 Java 类路径,但是当我尝试指定外部库时,我 运行 进入了 Error: Could not find or load main class Hello

我从这个简单的程序开始,它直接驻留在我的主目录中:

import java.util.*;

public class Hello {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println("Hello world");
    }
}

这可以编译并且运行很好...

[user ~]> ls -l
Hello.java
[user ~]> javac Hello.java
[user ~]> ls -l
Hello.java
Hello.class
[user ~]> java Hello
Hello world

...这告诉我类路径环境变量设置正确(因为它找到了 java.util 包)。

然而,当我尝试导入一个随机的第 3 方包并在 -classpath 中指定其位置时,我收到错误消息:

[user ~]> cat Hello.java
import java.util.*;
import org.apache.commons.lang3.time.*;

public class Hello {
    public static void main(String[] args) {
        StopWatch sw = new StopWatch();
        Date date = new Date();
        System.out.println("Hello world");
    }
}
[user ~]> ls .m2/repository/org/apache/commons/commons-lang3/3.3.1
commons-lang3-3.3.1.jar
[user ~]> javac -classpath ~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello.java
[user ~]> java -classpath ~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello
Error: Could not find or load main class Hello

有人可以告诉我我做错了什么吗?

首先,java.util classes 是 JRE 本身的一部分,因此自动可用,无论 class 路径是什么。

第一个示例工作正常,因为您没有指定任何 class 路径,因此使用默认路径(即 .,即当前目录)。

第二个示例指定了一个 class 路径,但其中不包含 .(当前目录),因此 commons-lang classes 可用在运行时,但不是你的 Hello class。使用

java -classpath .:~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello

还有,以后:

  • 永远不要在默认包中放入 class
  • 创建一个真正的项目结构,包含
    • 根目录
    • 包含 .java 文件的源目录,正确组织在包结构中
    • 一个 classes 目录,包含已编译的 .class 文件,当您想从头开始重新编译所有内容时,您可以清除该目录

下一步当然是使用Gradle或Maven作为构建工具,并遵循他们推荐的项目布局。