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
解决方案是什么?
答案 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”并且无法在搜索路径中找到它的简单情况中。还有一些其他案例,我怀疑,但相当罕见。
第二个例外发生在找到适当命名的类文件 时,但由于某种原因无法使用。这有两个主要原因:
答案 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();
}
}
*我很早就找到了这个问题的解决方案,但我通过科学探索的方法独立找到解决方案