运行时发生Java类路径NoClassDefFoundError

运行时发生Java类路径NoClassDefFoundError,java,jar,classpath,Java,Jar,Classpath,过了一段时间,我将回到爪哇。类路径有点问题。如果有人能为我指出正确的方向,我将不胜感激 我的文件夹结构如下: ├── lib │ └── algs4.jar └── src └── HelloWorld.java HelloWorld.java 导入edu.princeton.cs.algs4.StdOut; 公共类HelloWorld{ 公共静态void main(字符串[]args){ StdOut.println(“你好世界”); } } 我用下面的命令编译了我的程序 cd

过了一段时间,我将回到爪哇。类路径有点问题。如果有人能为我指出正确的方向,我将不胜感激

我的文件夹结构如下:

├── lib
│   └── algs4.jar
└── src
    └── HelloWorld.java
HelloWorld.java

导入edu.princeton.cs.algs4.StdOut;
公共类HelloWorld{
公共静态void main(字符串[]args){
StdOut.println(“你好世界”);
}
}
我用下面的命令编译了我的程序

cd src
javac -cp ../lib/* HelloWorld.java
但是,当我使用
javahelloworld
运行我的程序时,我得到以下错误

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/*
目录(和文件)查找类定义,当然,编译器找到了它们,并将字节码写入
HelloWorld.class
文件,但该字节码只包含您的代码(您在
HelloWorld.java
中编写的行)对于在那里使用的任何外部库,编译器将只存储一种带有完整包名和方法名的引用。
jar
中的字节码不会存储在HelloWorld.class文件中

因此,要执行
HelloWorld
,需要告诉JVM首先加载代码中使用
-cp
参数传递的所有外部类。 然后,JVM将执行您的代码,通过包/方法名查找对jar代码的引用并执行它们


如果不提供
-cp../lib/*
,JVM将只加载标准库(JDK中的所有类)和HelloWorld.class,因此它不会在内存中找到外部jar。

要执行程序,还需要像这样将
类路径
传递给java命令

java -cp ../lib/* HelloWorld
编译代码后,您告诉编译器使用
。/lib/*
目录(和文件)查找类定义,当然,编译器找到了它们,并将字节码写入
HelloWorld.class
文件,但该字节码只包含您的代码(您在
HelloWorld.java
中编写的行)对于在那里使用的任何外部库,编译器将只存储一种带有完整包名和方法名的引用。
jar
中的字节码不会存储在HelloWorld.class文件中

因此,要执行
HelloWorld
,需要告诉JVM首先加载代码中使用
-cp
参数传递的所有外部类。 然后,JVM将执行您的代码,通过包/方法名查找对jar代码的引用并执行它们


如果您不提供
-cp../lib/*
JVM将只加载标准库(JDK中的所有类)和HelloWorld.class,因此它将不会在内存中找到外部jar。

这很痛苦,但我最终修复了它。事实证明,在运行程序时,不仅要指定JAR文件的位置,还要指定自己文件的位置。(现在看来很明显>这很痛苦,但我最终修复了它。结果表明,在运行程序时,不仅要指定JAR文件的位置,还要指定自己文件的位置。(现在看来很明显>)。
java -cp ../lib/*:. HelloWorld