【问题标题】:Java: Error: Could not find or load main class Hello when trying to import an external library [duplicate]Java:错误:尝试导入外部库时找不到或加载主类 Hello [重复]
【发布时间】:2017-07-08 02:38:21
【问题描述】:

我知道这是一个常见问题,但我已阅读所有其他答案,但找不到解决方案。我正在尝试理解 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

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

【问题讨论】:

  • 当没有明确定义类路径时,编译器会在当前文件夹中搜索。当您为外部 JAR 定义类路径时,您成功地告诉编译器它在哪里,但随后它忽略了当前目录。

标签: java classpath javac


【解决方案1】:

首先,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 作为构建工具,并遵循他们推荐的项目布局。

【讨论】:

  • 好吧,这真是令人失望,我认为类路径总是会自动包含当前目录。我通常使用 Maven 及其推荐的项目结构,我只是将其设置为一个简单的实验来查看引擎盖。谢谢你的回答。
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2013-01-17
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多