在编译和运行时指定相同的jar文件时抛出NoClassDefFoundError

时间:2011-02-25 12:19:32

标签: java classpath

您好我正在尝试使用我自己代码中的外部Java包并继续获取NoClassDefFoundError,即使我使用的是与我编译的相同的类路径。

为了你的娱乐,我已经包含了一个简单的复制品,这对于我来说无疑是一个愚蠢的错误(到目前为止我已经在这里工作了大约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            [$!@#$!]  
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)

任何线索都非常感谢!

2 个答案:

答案 0 :(得分:1)

错误的参数序列?尝试:

java -cp foo.jar WTF

答案 1 :(得分:1)

WTF.class所在的目录应该在类路径中。 此外,Bar应该是公开的。

java -cp foo.jar:. WTF

:是Linux中的路径分隔符,如果您使用的是Windows,请将其替换为;