Как разрешить NoClassDefFoundError при работе с файлами классов - PullRequest
1 голос
/ 11 января 2012

Я все еще пытаюсь изучить Java и решил сделать еще один шаг вперед и попытаться использовать внешние файлы классов для хранения структур данных (например, файлов заголовков в C). Я продолжаю сталкиваться с NoClassDefFoundError и хотел бы получить некоторые методы или приемы, которые могут показать мне, что идет не так (и где), поскольку сообщение мне не очень понятно: (

Моя структура каталогов настроена следующим образом:

tarskin@5-PARA-11-0120:~/programming/Java/FindGlycopeps$ ls
Default.mzML  FindGlycopeps.class  FindGlycopeps.java  glycoproteomics
tarskin@5-PARA-11-0120:~/programming/Java/FindGlycopeps$ ls glycoproteomics/
Spectrum.class  Spectrum.java

Основная программа кодируется следующим образом:

package glycoproteomics;
import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.lang.*;

public class FindGlycopeps {

public static LinkedList outside_tag_reader (String filename, String tag) {
        LinkedList<String> someList = new LinkedList<String>();
        DataInputStream in = null;
    try {
        FileInputStream input = new FileInputStream(filename);
        in = new DataInputStream(input);
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line;
        String regexp = "<"+tag+">(.*)</"+tag+">";
        Pattern pattern = Pattern.compile(regexp);
        while ((line = reader.readLine()) != null) {
            Matcher matcher = pattern.matcher(line);
            if (matcher.find()) {
                String buffer = matcher.group(1);
                someList.add(buffer);
            }
        }
        in.close();
    } catch (Exception x) {
        System.err.println(x);
    }
    return(someList);
}

public static void main (String [ ] args) {
    LinkedList<String> binary = new LinkedList<String>();
    ArrayList<Spectrum> spectra = new ArrayList<Spectrum>();
    String file = args[0];
    if (file != null) {
        binary = FindGlycopeps.outside_tag_reader(file,"binary");
        int j = 0;
        for (int i = 0; i < binary.size(); i++) {
            String buffer = binary.get(i);
            if (i % 2 == 0) {
                spectra.add(j, new Spectrum());
                spectra.get(j).mzList.add(buffer);
            } else {
                spectra.get(j).intList.add(buffer);
            }
            j++;
        }
        System.out.println(spectra.get(1).mzList); // purely for testing

        } else {
            System.out.println("No file was specified");
        }
    }
}

«Структура данных» кодируется следующим образом:

package glycoproteomics;
import java.util.ArrayList;

public class Spectrum implements Comparable<Spectrum>{
   float precursor;
   ArrayList<String> mzList;
   ArrayList<String> intList;

   public int compareTo(Spectrum arg0) {
      return 0;
   }
}

Я скомпилировал оба файла .java только с помощью javac и пытался запустить основной класс из «корня», используя несколько вариантов java -classpath (также пробовал -cp) ./://Java/FindGlycopeps/glycoproteomics FindGlycopeps и он продолжает выдавать ошибки, такие как:

Exception in thread "main" java.lang.NoClassDefFoundError: FindGlycopeps (wrong name: glycoproteomics/FindGlycopeps)
    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)
Could not find the main class: FindGlycopeps. Program will exit.

Что было бы хорошим способом выяснить, как все идет не так и что следует изменить в моем «мышлении»? Я был бы признателен за объяснение, почему что-то должно быть сделано вместо «сделай это, чтобы исправить это», если это возможно.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Файлы классов Java должны находиться в каталоге с тем же именем, что и пакет. Таким образом, вам нужно добавить ~/programming/Java/FindGlycopeps к вашему classpath (а не ~/programming/Java/FindGlycopeps/glycoproteomics), и файл FindGlycopeps.class должен быть в ~/programming/Java/FindGlycopeps/glycoproteomics (вместо ~/programming/Java/FindGlycopeps)

1 голос
/ 11 января 2012

Файл FindGlycopeps.class должен находиться в каталоге glycoproteomics.Структура пакета отражается структурой каталогов в файловой системе.

...