Java 运行类时出现NoClassDefFoundError

Java 运行类时出现NoClassDefFoundError,java,eclipse,class,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.URLClas

我试图运行一个类,但出现以下错误:

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:我正在使用EclipseIndigo

编辑 我已经在命令行中运行了两次该类:

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.

你并没有给我们提供足够的信息来确定,但我的猜测是:

  • 您没有提供正确的完全限定类名
  • 您的类不在类路径上
对于第一种情况的示例,如果您的代码如下所示:

package foo;

public class MyClass {
    public static void main(String[] args) {
    }
}
那么您应该正在运行:

java foo.MyClass
编辑:由于提供了额外的信息,我怀疑我知道发生了什么。我怀疑该类不是在包中创建的,而是创建了一个运行配置,它只运行
MyClass
。它现在被移动到
com.example.main
,但没有更新运行配置


进入运行配置编辑器(单击“运行”按钮旁边的下拉菜单,选择运行配置…)并找到“MyClass”,然后检查要运行的类,并对其进行编辑以输入正确的包名。

您还没有给我们提供足够的信息来确定,但我猜:

  • 您没有提供正确的完全限定类名
  • 您的类不在类路径上
对于第一种情况的示例,如果您的代码如下所示:

package foo;

public class MyClass {
    public static void main(String[] args) {
    }
}
那么您应该正在运行:

java foo.MyClass
编辑:由于提供了额外的信息,我怀疑我知道发生了什么。我怀疑该类不是在包中创建的,而是创建了一个运行配置,它只运行
MyClass
。它现在被移动到
com.example.main
,但没有更新运行配置


进入运行配置编辑器(单击“运行”按钮旁边的下拉菜单,选择运行配置…)并找到“MyClass”,然后检查要运行的类,并对其进行编辑以输入正确的包名。

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

javac MyClass.java
现在应该有一个名为
MyClass.class
的文件

然后,要运行它,您需要确保包含
MyClass.class
文件的目录位于类路径中。如果未设置
CLASSPATH
环境变量,Java默认情况下将在当前目录中查找,因此您应该能够使用以下工具运行它:

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

java -cp . MyClass

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

javac MyClass.java
现在应该有一个名为
MyClass.class
的文件

然后,要运行它,您需要确保包含
MyClass.class
文件的目录位于类路径中。如果未设置
CLASSPATH
环境变量,Java默认情况下将在当前目录中查找,因此您应该能够使用以下工具运行它:

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

java -cp . MyClass


类和它的默认构造函数是否为public?@s.L.Barth是的,它是public请说明您是如何尝试运行代码的,以及一个简短但完整的代码示例。请查看如何解决问题@Dragos:您仍然没有显示如何运行它。“我直接运行这个类”不是很准确。这里A和B是什么?你的类真的不在包中吗?类和它的默认构造函数是否是public?@s.L.Barth是的,它是public请说明你是如何运行代码的,还有一个简短但完整的代码示例。请看一下如何解决这个问题@Dragos:您还没有展示如何运行它。“我直接运行这个类”不是很准确。这里A和B是什么?您的类真的不在包中吗?我使用的是
EclipseIndigo
作为IDE,所以我不应该自己编译它。我对这个问题做了更新。@Dragos:我没有问你是如何编译的,我问你是如何运行的。好的。该类位于项目
Example
的包
com.Example.main
中。我打开项目,打开包,在里面,我右键单击类
MyClass
。出现一个菜单。我从菜单中选择
runas->Java应用程序
。这就是我总是在Eclipse中运行应用程序的方式,所以我不知道问题出在哪里
A
是同一
com.example.main
包中的一个公共抽象类,
B
com.example.interface
中的一个公共接口@Dragos:好的,所以如果它在
com.example.main
包中,它不应该试图运行
MyClass
,它应该尝试运行
com.example.main.MyClass
。正在编辑…不,运行配置很好。确实出现了
com.example.main.MyClass
。你还有其他想法吗?我正在使用
eclipseindigo
作为IDE,所以我不应该自己编译它。我对这个问题做了更新。@Dragos:我没有问你是如何编译的,我问你是如何运行的。好的。该类位于项目
Example
的包
com.Example.main
中。我打开项目,打开包,然后进去