繁体   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