2009-12-24 41 views
1

我有一个简单的类从另一个jar中导入另一个类。一切编译好,但试图运行它...Java NoClassDefFoundError当jar明显有它

$ 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 

任何想法?你如何开始调试?

回答

8

我认为这个问题是在你运行该命令的方式:

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

你必须把类名的选项之后,像这样:

$ java -classpath <...> Convert 
相关问题