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

标签 java classpath javac

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

关于Java:错误:尝试导入外部库时无法找到或加载主类 Hello,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42317077/

相关文章:

java - 如何修复 Java UnsupportedClassVersionError

java - 在基于 Java 的网站上动态更新图表

java - 核心 Java 中的字符串

clojure - 如何从 clojure/cider/nrepl 中的同级文件导入内容?

java - jar 和“找不到类定义”错误

java - 为什么ant认为包不存在?

java - Java的SecureRandom循环

java - Hibernate 无法解析属性

java - 在最终的 Jar 中包含 php 文件,以便方法可以调用 php 文件

java - 为什么有 4 个单独的字节码用于执行静态/虚拟/接口(interface)/特殊方法,而一个就足够了?