我编写了下面的基本代码并保存到一个名为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)
我做错了什么?
提前致谢。
答案 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