Java:错误:尝试导入外部库时无法找到或加载主类Hello

Java:错误:尝试导入外部库时无法找到或加载主类Hello,java,classpath,javac,Java,Classpath,Javac,我知道这是一个常见的问题,但我已经阅读了所有其他答案,无法找到解决方案。我试图理解Java类路径,但在尝试指定外部库时遇到了错误:无法找到或加载主类Hello 我从这个简单的程序开始,它直接驻留在我的主目录中: import java.util.*; public class Hello { public static void main(String[] args) { Date date = new Date(); System.out.printl

我知道这是一个常见的问题,但我已经阅读了所有其他答案,无法找到解决方案。我试图理解Java类路径,但在尝试指定外部库时遇到了
错误:无法找到或加载主类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
…这告诉我classpath环境变量设置正确(因为它可以找到java.util包)

然而,当我尝试导入一个随机的第三方软件包并在
-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
类是JRE本身的一部分,因此无论类路径是什么,它们都是自动可用的

第一个示例运行良好,因为您没有指定任何类路径,因此使用默认的类路径(即当前目录)

第二个示例指定了一个类路径,但其中不包括
(当前目录),因此commons lang类在运行时可用,但Hello类不可用。使用

java -classpath .:~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello
此外,今后:

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

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

如果没有明确定义类路径,编译器将在当前文件夹中搜索。当您为外部JAR定义类路径时,您试图告诉编译器它在哪里,但是它忽略了当前目录。好的,这真的令人失望,我认为类路径总是自动包含当前目录。我通常使用Maven及其推荐的项目结构,我只是将其设置为一个简单的实验,以便深入研究。谢谢你的回答。