Java NoClassDefFoundError - PullRequest
       14

Java NoClassDefFoundError

1 голос
/ 08 декабря 2011

Для школьного задания мне нужно создать класс Blender, в котором будут реализованы некоторые заранее определенные вещи.Я получил JAR-файл imagecompositor.jar, который делает все и использует класс Blender.Файл JAR содержит два класса (ImageCompositor.class и StDraw.class).

Чтобы запустить программу, учителя говорят, что мне нужно выполнить следующее:

java -cp ... ass3.ImageCompositor img1 img2 offsetx offsety

Я знаю толькокак кодировать Java.Я понятия не имею, как загрузить внешние классы в файл JAR.Итак, я попробовал это:

java -cp imagecompositor.jar ass3.ImageCompositor img1.png img2.png 0 0

, но он выбросил NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: ass3/Blender
at ass3.ImageCompositor.main(ImageCompositor.java:113)

Класс Blender содержит строку package ass3.Что я делаю не так?

Я хочу дать больше информации, но не знаю, как получить трассировку стека и т. Д.

Ответы [ 3 ]

0 голосов
/ 08 декабря 2011

Где находится класс Blender?Чтобы быть найденным правильно, ваш класс Blender (в пакете "ass") должен находиться в каталоге с именем "ass" относительно вашего текущего каталога.Если это так (и вы не удаляете текущий директор . из пути к классам по умолчанию), вам не нужно изменять путь к классам.

Однако , в вашем случае выНужно изменить путь к классу (чтобы указать предоставленный файл jar), и команда, указанная в вашем сообщении , удаляет удаление . из пути.Поэтому вы должны сделать следующее:

    java -cp whatever.jar;. whatever_other_parameters

(обратите внимание на «;.», Добавленный к аргументу -CP.) Это вернет текущий каталог в путь к классу.

0 голосов
/ 08 декабря 2011

java.lang.NoClassDefFoundError обычно является ошибкой в ​​статическом конструкторе.JVM скажет java.lang.ClassNotFoundException, если она вообще не сможет найти ваш класс.Из вашего описания вопроса я думаю, что командная строка:

java -cp imagecompositor.jar ass3.ImageCompositor img1 img2 offsetx offsety

, что предполагает, что файл imagecompositor.jar находится в том же каталоге, где мы выполняем команду java.Это говорит компилятору java сделать все в imagecompositor.jar доступным для загрузчика классов, и мы загружаем класс с именем ImageCompositor, который находится в пакете ass3.Мы также предполагаем, что ImageCompositor имеет статический метод main, то есть как Java запускает вещи из командной строки.

0 голосов
/ 08 декабря 2011

Вам необходимо добавить свой класс Blender в путь к классам.

В командной строке

java -cp imagecompositor.jar ...

используется путь к классу imagecompositor.jar.Это говорит виртуальной машине Java (JVM) искать в файле jar.То, что не говорит JVM, это искать ваши классы.Если вы упаковали их в jar-файл, вам нужно сделать

java -cp imagecompositor.jar;myclasses.jar ...

, и если файлы .class находятся в дереве с корневым каталогом path/to/someRoot (например, класс ass3.Blender должен быть в path/to/someRoot/ass3/Blender.class), тогда вы должны использовать тот же синтаксис, но с корневым каталогом, а не с файлом .jar (я думаю это правильно, не могу найти документы):

java -cp imagecompositor.jar;path/to/someRoot ...
...