2011-02-25 57 views
1

嗨我试图从我自己的代码中使用外部Java包,并继续得到NoClassDefFoundError,即使我使用的是我编译的类路径。NoClassDefFoundError当在编译和运行时指定相同的jar文件时抛出

为了您的娱乐我已经包括了什么,无疑将是一个愚蠢的错误在我的部分(我已经在这个约6个小时)的

/* WTF/WTF.java */ 
import foo.Bar; 
class WTF 
{ 
    public static void main(String[] args) 
    { 
     Bar dontCare = new Bar(); 
    } 
} 

/* WTF/foo/Bar.java */ 
package foo; 

class Bar 
{ 
    public Bar() {} 
} 

现在从WTF一个光秃秃的骨头再现目录我运行以下:

 
javac foo/Bar.java    [ok] 
javac WTF.java     [ok] 
java WTF      [ok] 
jar cf foo.jar foo    [ok] 

我删除了WTF/foo目录,所以只有WTF/foo.jar可用。

 
javac WTF.java -cp foo.jar  [ok] 
java WTF -cp foo.jar   [[email protected]#$!] 
 
Exception in thread "main" java.lang.NoClassDefFoundError: foo/Bar 
    at WTF.main(WTF.java:7) 
Caused by: java.lang.ClassNotFoundException: foo.Bar 
    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) 

任何线索不胜感激!

+0

我不知道这是否编译! – adarshr 2011-02-25 12:27:47

+0

我的错误Bar在我的测试文件中被公开标记了,但是在编写列表时我错过了它 - 除了它是编译 – norlesh 2011-02-25 12:47:55

回答

1

哪里是WTF.class的目录应该是在classpath。 另外,Bar应该是公开的。

java -cp foo.jar:. WTF 

:是在Linux上的路径分隔符,如果你使用的是Windows与;更换。

+0

不是,根据错误消息找到了'WTF',但没有找到'foo.Bar'。 – 2011-02-25 12:40:38

+0

感谢克里斯,工作(我在Linux中) – norlesh 2011-02-25 12:44:28

+0

@christoffer:是的,但类路径参数必须在主类名称之前,我认为当前目录应该在它 – Kru 2011-02-26 17:36:17

1

错误的参数序列?尝试:

java -cp foo.jar WTF 
+0

听起来像它。主类名后面的参数是程序的参数。但是它应该是'java -cp。:foo.jar WTF'来包含本地目录(如果它包含'WTF.class'的话)。 – 2011-02-25 12:41:22

相关问题