2010-08-24 101 views
2

我写了下面的基本代码并保存到名为pdf.java的文件中。Java NoClassDefFoundError错误

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) 

我在做什么错?

在此先感谢。

回答

1

当你编译它,以便在产生的pdf.class当前目录。将其更改为:

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

将在./pdf子目录产生pdf.class。然后按如下方式运行:

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

嗨,我得到第二个命令 - 无法识别的选项:-d 无法创建Java虚拟机。 – usertest 2010-08-24 18:16:07

+1

这是一个错误的复制/过去,我认为命令的意思是'java -cp。:core-renderer.jar:iText-2.0.8.jar pdf.pdf' – 2010-08-24 18:23:29

+0

是的,的确如此。我点击帖子后很快就纠正了它,但user201140在我之前到达了那里。 – 2010-08-24 18:39:33

5

您的意思是java pdf.pdf作为您的pdf类是pdf包吗?

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

要么你去到PDF目录,并使用-d选项javac -d . pdf或者您在父目录中去,做的javac PDF/pdf.java`

+0

我没有看到一个PDF包的声明,但是你几乎肯定是正确的:) – 2010-08-24 18:06:25

+0

对不起,我恢复了它再次,它应该像你现在看到的那样。 – usertest 2010-08-24 18:07:05

+0

所以问题是pdf包。我看到了这种情况,因为如果没有软件包声明,调试会更困难。 – 2010-08-24 18:08:35

0

首先,由于类声明为包,因此必须使用包路径对其进行存储并调用它。

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

然后你可以用`java pdf.pdf'调用,就像Colin的答案中指出的一样。

这可能足以运行您当前的示例代码,因为它没有真正做任何事情。一旦你添加了更多的功能,你可能需要在执行时将你的库包含在类路径中,正如理查德的回答中所述。

顺便说一句,在Java编程中通常使用initcap类名称,例如, Pdf将是您示例中的类名,而pdf将是包名。

+0

我尝试将pdf.class移动到pdf目录并运行java pdf.pdf,但这似乎不起作用。 – usertest 2010-08-24 18:18:51

0

编译时和运行时的类路径是两个不同的东西。但是,它们通常是相同的,因为编译依赖关系与运行时依赖关系相同。由于您的main()方法抛出iText-2.0.8.jar(我认为)中定义的东西,你据此前人的精力定义你的classpath:

java -cp .:iText-2.0.8.jar pdf.pdf 
相关问题