Java NoClassDefFoundError, когда в банке он есть - PullRequest
1 голос
/ 24 декабря 2009

У меня есть простой класс, который импортирует другой класс из другой банки. Все отлично компилируется, но пытается его запустить ...

$ jar tvf ../../pig-2.1.jar  | grep TupleFact
1641 Mon Feb 02 17:56:32 UTC 2009 org/apache/pig/data/DefaultTupleFactory.class
2289 Mon Feb 02 17:56:30 UTC 2009 org/apache/pig/data/TupleFactory.class
$ javac ../src/Convert.java -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'`
$ java Convert -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'`
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/pig/data/TupleFactory
        at Convert.<clinit>(Convert.java:31)
Caused by: java.lang.ClassNotFoundException: org.apache.pig.data.TupleFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        ... 1 more

Есть идеи? Как начать отлаживать это?

Ответы [ 2 ]

8 голосов
/ 24 декабря 2009

Я думаю, что проблема в том, как вы запускаете команду:

java Convert -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'`

должно быть

java  -classpath `echo ../lib/* ../../lib/* | sed 's/ /:/g'` Convert

Синтаксис командной строки для команды "java":

javac [ <options for the JVM> ... ] <classname> [ <application args> ... ]

Если вы добавите опцию "-classpath" после имени класса, она будет рассматриваться как аргументы приложения, и вы запустите приложение, используя путь к классу по умолчанию.

3 голосов
/ 24 декабря 2009

Вы должны поставить имя класса после параметров, например:

$ java -classpath <...> Convert
...