Java NoClassDefFoundError错误

时间:2010-08-24 18:01:08

标签: java manifest

我编写了下面的基本代码并保存到一个名为pdf.java的文件中。

package pdf;

import java.util.*;
import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.util.regex.*;

public class pdf {

    public static void main(String[] args) throws IOException, DocumentException{
        System.out.println("Hello World2!");
    }

}

然后我按照这样编译它,

javac pdf.java -cp core-renderer.jar:iText-2.0.8.jar

当我得到一个pdf.class文件时,这似乎有效。然后我尝试使用以下命令运行它。

java pdf

我得到了以下输出,

Exception in thread "main" java.lang.NoClassDefFoundError: pdf (wrong name: pdf/pdf)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)

我做错了什么?

提前致谢。

4 个答案:

答案 0 :(得分:5)

您的java pdf.pdf课程是否在pdf包中,您的意思是pdf吗?

如果你的pdf类在pdf包中,它应该在pdf目录中(如果你的MyClass类在my.package包中,它应该在我的/ package /目录中)。

要么进入pdf目录并使用-d选项javac -d . pdf,要么进入父目录并执行javac pdf / pdf.java`

答案 1 :(得分:1)

当你编译它时,pdf.class是在当前目录中生成的。将其更改为:

javac -cp core-renderer.jar:iText-2.0.8.jar -d . pdf.java 

哪个会在pdf.class子目录中生成./pdf。然后运行如下:

java -cp .:core-renderer.jar:iText-2.0.8.jar -d . pdf.java 

答案 2 :(得分:0)

首先,由于类声明在包中,因此必须存储它并使用包路径调用它。

您需要创建与包结构匹配的目录结构。在您的情况下,您需要创建一个名为pdf的目录并将pdf.class移入其中。

然后你会按照科林的回答中的指点调用`java pdf.pdf'。

这可能足以运行您当前的示例代码,因为它实际上并没有做太多的事情。一旦你开始添加更多功能,你可能需要在执行时将你的库包含在类路径中,如Richard的回答所述。

BTW,在Java编程中常见的是输入类名,例如Pdf将是示例中的类名,而pdf将是包名。

答案 3 :(得分:0)

编译时和运行时的类路径是两个不同的东西。但是,它们通常是相同的,因为编译依赖性与运行时依赖性相同。由于您的main()方法会抛出iText-2.0.8.jar中定义的内容(我认为),因此您可以相应地定义类路径:

java -cp .:iText-2.0.8.jar pdf.pdf