运行类时NoClassDefFoundError

时间:2012-01-20 10:46:59

标签: java eclipse class

我正在尝试运行一个类,但是我收到以下错误:

java.lang.NoClassDefFoundError: MyClass
Caused by: java.lang.ClassNotFoundException: MyClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 Exception in thread "main" 

虽然main方法位于MyClass并且我直接运行此类,但确实发生了这种情况。 为什么这个类没有找到,虽然我从它启动程序?

以下是一些代码:

public class MyClass extends A implements B{
public MyClass() throws Exception {
//make some initializations
}
public static void main(final String[] args) throws Exception {
MyClass myClass = new MyClass();
//do stuff with myClass
}
}

PS:我正在使用Eclipse Indigo

修改 我在命令行中运行了两次类:

D:\Eclipse JEE\Workspace2\Example\target\classes\com\example\main>java com.example.main.MyClass
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/main/MyClass
Caused by: java.lang.ClassNotFoundException: com.example.main.MyClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: com.example.main.MyClass.  Program will exit.

D:\Eclipse JEE\Workspace2\Example\target\classes\com\example\main>java GeoDAOImpl
Exception in thread "main" java.lang.NoClassDefFoundError: MyClass(wrong name: com/example/main/MyClass)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: MyClass.  Program will exit.

2 个答案:

答案 0 :(得分:4)

你还没有给我们足够的信息来肯定地说,但我的猜测是:

  • 您没有提供正确的完全合格的班级名称
  • 您的课程不在课程

对于第一种情况的示例,如果您的代码如下所示:

package foo;

public class MyClass {
    public static void main(String[] args) {
    }
}

然后你应该跑步:

java foo.MyClass
编辑:提供额外信息,我怀疑我知道发生了什么。我怀疑该类是创建的不在包中,并且创建了一个仅运行MyClass的运行配置。它现在已移至com.example.main,但未更新运行配置。

进入运行配置编辑器(单击“运行”按钮旁边的下拉列表,选择“运行配置...”)并找到“MyClass”,然后检查要运行的类,并将其编辑为将正确的包名称放入。

答案 1 :(得分:1)

如果您尚未编译源文件,则首先需要编译源文件。假设您的类MyClass不在包中,并且您位于包含源文件MyClass.java的目录中,请使用以下命令编译它:

javac MyClass.java

您现在应该有一个名为MyClass.class的文件。

然后,要运行它,您需要确保包含MyClass.class文件的目录位于类路径中。如果您没有设置CLASSPATH环境变量,Java默认会查找当前目录,因此您应该可以使用以下命令运行它:

java MyClass

如果这不起作用,您可以使用.选项将当前目录-cp显式放在类路径中:

java -cp . MyClass