2012-02-09 51 views
0

java.lang.NoClassDefFoundErrorRunnig jar依赖java类文件

我有一个java程序,它依赖于两个jar文件。 我使用命令编译程序:

javac -classpath jar1.jar:jar2.jar myprog.java它编译成功。

但是,当我尝试运行程序使用命令:java -cp jar1.jar:jar2.jar myprog,它是投掷java.lang.NoClassDefFoundError。请帮助,我在哪里错了?

我使用的是Ubuntu 10.04。

实际的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: userapps/SelectionTask_classes/SelectionTask 
Caused by: java.lang.ClassNotFoundException: userapps.SelectionTask_classes.SelectionTask 
    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: userapps/SelectionTask_classes/SelectionTask. Program will exit. 

其中SelectionTask成功编译后生成我的类文件。

+1

是在同一目录中编译的类/可执行的.jar文件?如果不是,则需要指定这些.jar文件的绝对/相对路径。 – eternaln00b 2012-02-09 13:30:57

+0

是的,我已经指定了两个罐子的绝对路径..!我运行 实际的命令是: java命令的Hadoop-0.20.1-core.jar添加:LIB/hadoopdb.jar userapps/SelectionTask_classes/SelectionTask – 2012-02-09 13:38:42

+0

可能是此链接可能会给你一些想法... HTTP: //javarevisited.blogspot.in/2011/06/noclassdeffounderror-exception-in.html – 2012-02-09 13:42:14

回答

1

确保当前目录也在类路径中。尝试运行:

java -cp .:jar1.jar:jar2.jar myprog 

如果您编译的类文件myprog.class位于当前目录中。

(这里假设你的程序不在包中)。

+0

同样的错误!我正在指定我的类文件的完整路径。 java -cp hadoop-0.20.1-core.jar:lib/hadoopdb.jar userapps/SelectionTask_classes/SelectionTask.class。但是,将当前目录添加到classpath是没用的。 – 2012-02-09 13:58:16

+0

@AbhishekSagar在上面发布的命令行中,我没有看到将当前目录'.'添加到您的类路径中。 – Jesper 2012-02-09 14:38:59

0

您需要添加编译的java程序(* .class)文件所在的目录。如果是在当前目录下,那么你可以这样运行了它(注意这表示当前工作目录“”):

java -cp .:jar1.jar:jar2.jar myprog 
+0

java命令userapps/SelectionTask_classes:Hadoop的0.20.1-core.jar添加:LIB/hadoopdb.jar userapps/SelectionTask_classes/SelectionTask.class 其中 userapps/SelectionTask_classes - 是我的类文件的目录。 仍然是同样的错误。 – 2012-02-09 14:00:59

+0

@AbhishekSagar,这是不正确的。请查看“java”命令的文档,它是命令行参数。你必须指定JAR文件的名称和CLASS文件的DIRECTORY,而不是实际的类文件的路径。 – eternaln00b 2012-02-09 14:07:03

+0

所以你的命令不能再次工作!在那里你指定了dir,但是Java使用在终端中弹出。 我尝试: 的java -cp的hadoop-0.20.1-core.jar添加:LIB/hadoopdb.jar:userapps/SelectionTask_classes/userapps/SelectionTask_classes/ (也就是删除该类文件的名称,但同样的错误) – 2012-02-09 14:34:44

0

查看错误,它在抱怨不能够找到“userapps.SelectionTask_classes.SelectionTask “,它暗示你的类路径中的最后一项不正确指定。现在,假设你指定的JAR文件在下面的目录结构:

./hadoop-0.20.1-core.jar

./lib/hadoopdb.jar

./userapps/SelectionTask_classes/

你可以运行:

java -cp hadoop-0.20.1-core.jar:lib/hadoopdb.jar:userapps/SelectionTask_classes/ myprog 
+0

我试过你的命令,它显示以下内容: 用法:java [-options] class [args ...] ...和使用java选项的整个手册。 – 2012-02-09 14:22:41

+0

java -cp hadoop-0.20.1-core.jar:lib/hadoopdb.jar:userapps/SelectionTask_classes/userapps/SelectionTask_classes/SelectionTask.class – 2012-02-09 14:24:35

+0

不要指定类文件的完整路径。正如我反复提到的那样,只能指定JAR文件的完整路径。对于CLASS文件,只需指定包含类文件的目录即可。所以,上面命令的最后一项是不必要的。 – eternaln00b 2012-02-09 14:34:50