[英]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.