在具有 main() 的 class 中定义包名称时出现 NoClassDefFoundError
NoClassDefFoundError when a package name is defined in the class that has main()
目录结构:
ClassOne.java
ClassOne.class
/dir
ClassTwo.java
ClassTwo.class
我纯粹是为了这个而使用终端。我使用 javac
编译两者以生成 class 文件。
ClassOne.java
import dir.ClassTwo;
public class ClassOne{
public static void main(String[] args){
ClassTwo two = new ClassTwo();
two.printIt();
}
}
ClassTwo.java
package dir;
public class ClassTwo {
void printIt() {
System.out.println("I am class two!");
}
public static void main(String[] args){
System.out.println("Hello");
}
}
运行 ClassOne.java 按预期工作(编译器错误由于 ClassTwo.printIt() 被设置为默认值)。然而,让我难过的是 运行 ClassTwo.
时得到的 NoClassDefFoundError
我在顶部添加 package dir;
语句时注意到错误 - 没有它,ClassTwo 运行s 按预期运行,但 ClassOne 出现错误。
这是我在 运行 ClassTwo 中定义 package dir;
时得到的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: ClassTwo (wrong name: dir/ClassTwo)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
为什么会这样?
因为包名称是 class 名称的一部分。上一个文件夹,然后 运行 用
之类的东西
java -cp . dir.ClassTwo
目录结构:
ClassOne.java
ClassOne.class
/dir
ClassTwo.java
ClassTwo.class
我纯粹是为了这个而使用终端。我使用 javac
编译两者以生成 class 文件。
ClassOne.java
import dir.ClassTwo;
public class ClassOne{
public static void main(String[] args){
ClassTwo two = new ClassTwo();
two.printIt();
}
}
ClassTwo.java
package dir;
public class ClassTwo {
void printIt() {
System.out.println("I am class two!");
}
public static void main(String[] args){
System.out.println("Hello");
}
}
运行 ClassOne.java 按预期工作(编译器错误由于 ClassTwo.printIt() 被设置为默认值)。然而,让我难过的是 运行 ClassTwo.
时得到的NoClassDefFoundError
我在顶部添加 package dir;
语句时注意到错误 - 没有它,ClassTwo 运行s 按预期运行,但 ClassOne 出现错误。
这是我在 运行 ClassTwo 中定义 package dir;
时得到的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: ClassTwo (wrong name: dir/ClassTwo)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
为什么会这样?
因为包名称是 class 名称的一部分。上一个文件夹,然后 运行 用
之类的东西java -cp . dir.ClassTwo