2012-02-09 53 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