Что вызывает NoSuchMethodError и NoClassDefFoundError? - PullRequest
0 голосов
/ 09 февраля 2012

Когда я запускаю test.class, я получаю следующую ошибку:

Exception in thread "main" java.lang.NoSuchMethodError: ml.Temp.<init>(Ljava/lang/String;II)V
    at test.main(test.java:11)

А вот код для test.java

import java.io.*;
import ml.*;

class test
{
        public static void main(String[] args) throws FileNotFoundException, IOException
        {
                String filename = "input";

                Temp id = new Temp(filename, 6, 100);
                    id.someFunction();          
         }
}

По сути, у меня есть файл JAR, содержащий Temp.class (Temp - это библиотечный файл, который я написал и который находится в пакете ml).Temp имеет конструктор, который принимает эти три аргумента, и публичную функцию someFunction.

Не уверен, поможет ли это, но я включил classpath файла jar во время компиляции.Когда я включаю classpath файла jar во время выполнения test.class, я получаю следующее

Exception in thread "main" java.lang.NoClassDefFoundError: test
Caused by: java.lang.ClassNotFoundException: test
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    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)
Could not find the main class: test. Program will exit.

EDIT:

Если это помогает, я скомпилировал следующим образом (ml.jar и test.java находятся в одном каталоге)

javac -cp ml.jar test.java

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Трудно точно сказать, что произошло без исходного кода, но похоже, что ваша библиотека и проект, который ее использует, не синхронизированы. Изменили ли вы сигнатуры любых методов в вашей библиотеке / проекте? Я бы порекомендовал все перекомпилировать, а затем проверить, использует ли класс test последнюю версию библиотеки, которую вы перекомпилировали, а также объявил ли она public.

Более полезную информацию о том, как читать NoSuchMethodError и т. Д., Можно найти в большой статье здесь: http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/

1 голос
/ 09 февраля 2012

Я собираюсь притвориться вами и пройти весь процесс:

1 - Библиотека. Я нахожусь в каталоге, скажем, workspace. Внутри я создал каталог с именем ml.
Внутри каталога ml я создал новый файл с именем Temp.java, который, например, содержит следующее:

package ml;

public class Temp
{
    public Temp(String filename, int arg1, int arg2)
    {
        //do something
    }

    public void someFunction()
    {
        //do something else
        System.out.println("look left!");
    }
}

Сейчас я собираюсь скомпилировать библиотечный класс и создать библиотечный jar. Сначала я компилирую, запустив

javac ./Temp.java

внутри каталога ml. Затем я выполняю jar библиотеки, переместив один каталог в каталог workspace и выполнив:

jar cf ml.jar ml/

2 - Программа. Теперь я создаю файл Test.java внутри каталога workspace. Файл содержит следующее:

import java.io.*;
import ml.*;

public class Test
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        String filename = "input";

        Temp id = new Temp(filename, 6, 100);
        id.someFunction();
    }
}

3 - Результат. Теперь я продолжаю компилировать и запускать мою тестовую программу. Внутри каталога workspace я запускаю:

javac -cp ./:ml.jar ./Test.java

Наконец-то я могу запустить программу, выполнив следующую команду в каталоге workspace:

java -cp ./:ml.jar Test

Что бы показать вывод:

look left!

Надеюсь, это поможет.

1 голос
/ 09 февраля 2012

вы должны запустить команду java -cp <path-to-ml.jar> test из пути, в котором находится test.class.

РЕДАКТИРОВАТЬ

NoSuchMethodError указывает, что в строке 11класс test вы пытаетесь использовать конструктор ml.ID3 (не Temp!) с подписью (String, int, int), которая не существует.Это не значит, что его нет в пути к классам, потому что это приведет к NoClassDefFoundError.

С другой стороны, NoClassDefFoundError: test означает, что test больше не находится в вашем clsspath.Добавление банки в путь к классам, если это все, что вы действительно сделали, чтобы получить NoClassDefFoundError: test, , не может заставить test исчезнуть из вашего пути к классам ... Так что, скорее всего, вы сделалинекоторые другие непреднамеренные действия.

РЕДАКТИРОВАТЬ 2

Возможно, этот конструктор существует в ID3, используемом в вашей среде разработки, но, очевидно, не существует в вашей среде выполнения,Если это сторонний jat, может случиться так, что у вас есть две версии jar: одна используется в dev, а другая во время выполнения.Или, может быть, оба они появляются в вашей среде выполнения, но ту, в которой отсутствует приоритет инструмента конструктора.

...