接口上的NoClassDefFoundError,而不是类

时间:2011-07-12 11:59:29

标签: java noclassdeffounderror

NoClassDefFoundError存在问题。我正在使用接口,并且不应该有类定义:

package code;
public interface Constants {...}

实现此接口的类编译时没有任何错误,并且已经构建了一个JAR文件,但在运行时它给了我一个错误。

import ...;
import code.*;
public class MultiDoc extends LanguageAnalyser implements Constants{}

Constants仅包含常量列表。

我读了一些指向CLASSPATH的帖子是导致此问题的原因,但我的CLASSPATH中有code个包。如果我没有它,它将产生编译错误。所以,问题应该是别的。

运行时错误是:

java.lang.NoClassDefFoundError: code/Constants

解决方案是什么?

6 个答案:

答案 0 :(得分:9)

检查此类的静态初始化。看这里:what is the difference between NoClassDefFoundError and ClassNotFoundException
java.lang.NoClassDefFoundError: code/Constants并不意味着Constants类不在CLASSPATH中。事实上,情况正好相反。这意味着类是由ClassLoader找到的,但是在尝试加载类时,它会在读取类定义时遇到错误。当有问题的类具有静态块或使用ClassLoader未找到的类的成员时,通常会发生这种情况。

答案 1 :(得分:2)

请注意,有两个不同的异常听起来非常相似:ClassNotFoundException和NoClassDefFoundError。

第一个例外发生在JVM查找“packageB.ClassA”并且无法在搜索路径中找到它的简单情况中。还有一些其他案例,我怀疑,但相当罕见。

第二个例外发生在找到适当命名的类文件 时,但由于某种原因无法使用。这有两个主要原因:

  1. 该类位于例如“packageA / ClassA.class”中,但内部命名为“packageB / ClassA”(或者源代码中意外省略了包名,或者类文件位于错误的目录中,包名)。
  2. 加载类时,出现了某种错误,通常是初始化静态存储时出错。

答案 2 :(得分:1)

根据您的问题,我看到编译的Constants接口位于一个jar中,该jar与实现类的jar /位置不同。所以你应该能够像这样执行你的应用程序:

java -cp /path-to-jar/JarContainingConstants.jar my.application.Main

(用真名替换姓名)

如果你已经将其他类添加到另一个jar和那么如果你创建了jar可执行文件而那么你试图运行它与java -jar MyApplication.jar然后在执行的jar之外定义的任何类路径都将被忽略。但上面的命令应该适用于任何jar(可执行或不可执行)。


来自评论

[alef@localhost ~]$ java -cp /../code-misc.jar /.../MultiDoc.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: /.../MultiDoc/MultiDoc/jar 
Caused by: java.lang.ClassNotFoundException: .home. 
  ... .MultiDocDateMathcer.jar 
  at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
  ... 
  at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
Could not find the main class: /.../MultiDoc/MultiDocr.jar. 
Program will exit.

你打电话肯定不对。这样做(更新):

java -Dgate.home=/my/new/gate/home/directory -cp gate.jar;code-misc.jar;MultiDoc.jar gate.Main

答案 3 :(得分:1)

如果您的类路径中有somedirectory/code,那么错误总是需要类路径中的 base 目录(在这种情况下,它将是somedirectory)。 Java本身将在这些根目录中搜索名为code的目录,其中包含名为Constants.class的文件。

答案 4 :(得分:1)

编译时可能在CLASSPATH中有它,但这并不能保证它在运行时位于CLASSPATH中。你怎么运行它?

答案 5 :(得分:0)

任何接口都必须在类中声明。

public class Calbacks {
    public interface IBaseFragmentInterface {
        void NotifyMainActivity();
    }
}

*我很早就找到了这个问题的解决方案,但我通过科学探索的方法独立找到解决方案