【问题标题】:NoClassDefFoundError when running a class [closed]运行类时出现 NoClassDefFoundError [关闭]
【发布时间】:2012-01-20 10:46:59
【问题描述】:

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

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.

【问题讨论】:

  • 是类和它的默认构造函数public ?
  • @S.L.Barth 是的,是public
  • 请展示您尝试运行代码的方式,以及相关代码的简短但完整的示例。
  • 请看看如何解决这个问题javarevisited.blogspot.com/2011/06/…
  • @Dragos:你还没有展示你是如何运行它的。 “我直接运行这个类”不是很精确。这里的A和B是什么?你的课真的不在包里吗?

标签: java eclipse class


【解决方案1】:

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

  • 您没有提供正确的完全限定类名
  • 你的类不在类路径中

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

package foo;

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

那你应该跑了:

java foo.MyClass

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

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

【讨论】:

  • 我使用Eclipse Indigo作为IDE,所以我不应该自己编译它。我更新了这个问题。
  • @Dragos:我没有问你是如何编译它的——我问的是你是如何尝试运行它的。
  • 好的。该类在项目Example 中,在包com.example.main 中。我打开项目,打开包并在其中右键单击类MyClass。出现一个菜单。我从该菜单中选择Run As -> Java Application。这就是我总是在 Eclipse 中运行应用程序的方式,所以我看不出问题出在哪里。 A 是同一个com.example.main 包中的公共抽象类,Bcom.example.interface 中的公共接口。
  • @Dragos:好的,所以如果它在com.example.main 的包中,它不应该尝试运行MyClass,它应该尝试运行com.example.main.MyClass。正在编辑...
  • 不,运行配置很好。确实出现了com.example.main.MyClass。你还有什么我可以尝试的想法吗?
【解决方案2】:

如果您还没有编译源文件,则首先需要编译。假设你的类MyClass不在包中,并且你在包含源文件MyClass.java的目录中,编译它:

javac MyClass.java

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

然后,要运行它,您需要确保包含MyClass.class 文件的目录在类路径中。如果您没有设置 CLASSPATH 环境变量,Java 将默认在当前目录中查找,因此您应该能够运行它:

java MyClass

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

java -cp . MyClass

【讨论】:

  • 我使用Eclipse Indigo作为IDE,所以我不应该自己编译它。我更新了这个问题。
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2013-04-26
相关资源
最近更新 更多