![](/img/trans.png)
[英]java.lang.NoClassDefFoundError at Runtime: Need Class not on Classpath
[英]Java Classpath NoClassDefFoundError During Runtime
一段时间后,我将回到 Java。 类路径有点麻烦。 如果有人能指出我正确的方向,我将不胜感激!
我的文件夹结构如下:
├── lib
│ └── algs4.jar
└── src
└── HelloWorld.java
HelloWorld.java
import edu.princeton.cs.algs4.StdOut;
public class HelloWorld {
public static void main(String[] args) {
StdOut.println("Hello World");
}
}
我用以下 cmd 编译了我的程序
cd src
javac -cp ../lib/* HelloWorld.java
但是,当我使用java HelloWorld
运行我的程序时,我收到以下错误。
Exception in thread "main" java.lang.NoClassDefFoundError: edu/princeton/cs/algs4/StdOut
at HelloWorld.main(HelloWorld.java:5)
Caused by: java.lang.ClassNotFoundException: edu.princeton.cs.algs4.StdOut
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
我不明白它如何编译得很好,但是它在运行时无法找到类。 有人可以对此有所了解吗? 先感谢您!
要执行您的程序,您还需要像这样将classpath
传递给 java 命令。
java -cp ../lib/* HelloWorld
编译代码后,您告诉编译器使用../lib/*
目录(和文件)查找 class 定义,当然,编译器找到了它们,并将字节码写入HelloWorld.class
文件,但此字节码仅包含您在其中使用的任何外部库的代码(您在HelloWorld.java
中编写的行),编译器将仅存储具有完整 package 名称和方法名称的引用。 jar
中的任何字节码都不会存储在 HelloWorld.class 文件中。
因此,要执行HelloWorld
,您需要告诉 JVM 首先加载您在代码中使用-cp
参数传递它们的所有外部类。 然后,JVM 将执行您的代码,通过包/方法名称查找对 jar 代码的引用并执行它们。
If you don't provide -cp../lib/*
the JVM will load only the standard library (All the classes in JDK) and your HelloWorld.class thus it won't find the external jar in memory.
这很痛苦,但我终于解决了。 结果在运行程序时,您不仅需要指定 JAR 文件的位置,还必须指定自己文件的位置。 (现在看起来很明显>.<)
例如,在我的情况下,运行以下是不够的。
java -cp ../lib/* HelloWorld
我们包含了 JARs,但没有包含实际包含 HelloWorld.class 的文件夹。
要解决此问题,我必须运行以下命令。 我们包括 JAR 的位置和正在执行的文件的位置。
java -cp ../lib/*:. HelloWorld
(根据您的操作系统/shell 设置,有些人可能不得不转义*
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.