【问题标题】:NoClassDefFoundError thrown when specifying same jar file at compile and run time在编译和运行时指定相同的 jar 文件时抛出 NoClassDefFoundError
【发布时间】:2011-02-25 12:19:31
【问题描述】:

您好,我正在尝试使用我自己的代码中的外部 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 [好的] javac WTF.java [好的] java WTF [好的] jar cf foo.jar foo [ok]

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

javac WTF.java -cp foo.jar [ok] java WTF -cp foo.jar [$!@#$!] 线程“main”中的异常 java.lang.NoClassDefFoundError: foo/Bar 在 WTF.main(WTF.java:7) 引起:java.lang.ClassNotFoundException: foo.Bar 在 java.net.URLClassLoader$1.run(URLClassLoader.java:217) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:205) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:321) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:266)

非常感谢任何线索!

【问题讨论】:

  • 我想知道这是否甚至编译!
  • 我的错误 Bar 在我的测试文件中被标记为公开,但我在编写清单时错过了它 - 除了是的,它确实可以编译

标签: java classpath


【解决方案1】:

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

java -cp foo.jar:. WTF

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

【讨论】:

  • 不是,根据报错信息找到WTF,但不是foo.Bar
  • @christoffer: 是的,但是classpath参数必须在主类名之前,我认为当前目录应该在里面
【解决方案2】:

参数顺序错误?试试:

java -cp foo.jar WTF

【讨论】:

  • 听起来像。主类名后面的参数是程序的参数。但是如果本地目录包含WTF.class,则应该是java -cp .:foo.jar WTF
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多