簡體   English   中英

Java 運行時類路徑 NoClassDefFoundError

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM