运行时发生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