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作为构建工具,并遵循他们推荐的项目布局。
我知道这是一个常见问题,但我已阅读所有其他答案,但找不到解决方案。我试图理解 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作为构建工具,并遵循他们推荐的项目布局。