Ошибка Java NoClassDefFoundError - PullRequest
       6

Ошибка Java NoClassDefFoundError

2 голосов
/ 24 августа 2010

Я написал основной код ниже и сохранил в файл с именем 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 ]

5 голосов
/ 24 августа 2010

Разве вы не имели в виду java pdf.pdf, поскольку ваш pdf класс находится в пакете pdf?

Если ваш класс pdf находится в пакете pdf, он должен находиться в каталоге pdf (как, если ваш класс MyClass находится в пакете my.package, он должен находиться в каталоге my / package /).

Либо вы заходите в каталог pdf и используете опцию -d javac -d . pdf, либо заходите в родительский каталог и делаете javac pdf / pdf.java`

1 голос
/ 24 августа 2010

Когда вы это скомпилировали, в текущем каталоге был создан файл 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 
0 голосов
/ 24 августа 2010

Classpath для времени компиляции и для времени выполнения - это две разные вещи.Однако они часто идентичны, поскольку зависимости компиляции идентичны зависимостям времени выполнения.Так как ваш main() метод выбрасывает что-то определенное в iText-2.0.8.jar (я думаю), вы должны определить свой classpath соответственно:

java -cp .:iText-2.0.8.jar pdf.pdf
0 голосов
/ 24 августа 2010

Во-первых, поскольку класс объявлен как в пакете, вы должны сохранить его и вызвать его, используя путь к пакету.

Вам необходимо создать структуру каталогов, соответствующую структуре пакета.В вашем случае вам нужно создать каталог с именем pdf и переместить в него pdf.class.

Затем вы должны вызвать `java pdf.pdf ', как указано в ответе Колина.

Этого может быть достаточно для запуска вашего текущего примера кода, поскольку он ничего не делает.Как только вы добавите больше функциональности, вам, вероятно, потребуется включить ваши библиотеки в путь к классам при выполнении, как описано в ответе Ричарда.

Кстати, в программировании на Java принято именовать имена классов initcap, например, Pdf будет именем класса в вашем примере, а pdf будет именем пакета.

...