5

我已经为此工作了大约一个小时,并浏览了 stackoverflow 上的问答,但我还没有找到解决我问题的建议。如果这是重复的,我很抱歉,但我找不到任何重复的问题,其答案可以解决我的具体问题。

我第一次尝试从终端编写和编译一个 java 程序(到目前为止,我一直使用 Eclipse for java 和 VIM 来处理其他一切,但我觉得是时候完全切换到 VIM 了)。这是我当前的 HelloWorld 代码:

package main;

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}

我使用以下命令编译并运行(指定类路径以确保这不是问题):

javac -cp "./" HelloWorld.java
java -cp "./" HelloWorld

这给了我以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: main/HelloWorld)
    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.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.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)

我知道它正在查看文件 HelloWorld.class 并尝试访问 HelloWorld 类,因为如果我将运行命令更改为:

java -cp "./" Foo

我收到一条完全不同的错误消息:

Error: Could not find or load main class Foo

我已经尝试了几十页的故障排除,但都失败了,包括以下内容:

线程“main”中的异常 java.lang.NoSuchMethodError: main

http://introcs.cs.princeton.edu/java/15inout/mac-cmd.html

java -version产量:

java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode)

我的操作系统是 LinuxMint 并uname -a产生:

Linux will-Latitude-D620 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
4

4 回答 4

23

主包;

这意味着您的类驻留在main包中,其规范名称是main.HelloWorld.

Java 要求包名也应该反映在目录结构中。这意味着:

  1. 您的HelloWorld.java文件应位于名为main
  2. 您应该从包含的目录执行javacand ,而不是从它本身javamainmain
  3. 类路径应该包含目录所在的main目录,而不是main它本身
  4. java期望执行的类的规范名称,所以main.HelloWorld

所以,回顾一下:

你应该有类似的东西myproject/main/HelloWorld.java

myproject, 运行javac main/HelloWorld.java

myproject, 运行java -cp ./ main.HelloWorld

于 2013-01-03T03:36:58.037 回答
9

您已将您的类放在名为“main”的包中,但您试图将其视为不在包中。由于您放在package main;源文件的顶部,因此您需要将 HelloWorld.java 放在 ./main 中,然后 run javac ./main/HelloWorld.java,然后是java -cp . main.HelloWorld.

这些命令将为您提供您正在尝试构建的工作示例:

mkdir main
echo 'package main; public class HelloWorld { public static void main(String... args) { System.out.println("Hello World"); } }' > main/HelloWorld.java
javac main/HelloWorld.java
java -cp . main.HelloWorld
于 2013-01-03T03:30:51.680 回答
2

作为初学者,您可能会遇到错误输出相同的非常相似的情况。您尝试编译并运行您的简单程序(没有设置任何包),然后执行以下操作:

javac HelloWorld.java
java HelloWorld.class

这会给你同样的 java.lang.NoClassDefFoundError 因为 java 认为 HelloWorld 是你的和类你的类名。要解决它,只需使用

javac HelloWorld.java
java HelloWorld

请参阅 Java 页面 -课程:常见问题(及其解决方案)

于 2013-11-04T21:19:07.710 回答
0

问题: 基本上,线程“main”中的异常java.lang.NoClassDefFoundError

表示在类路径中找不到您尝试运行的类。

解决方案:您需要将.jar包含此类的类或文件添加到 java 类路径中。从命令行运行 java 类时,需要添加点 (.)

java YourSingleClass -cp .

进入告诉JVM在实际目录中搜索类的类路径。

如果您从 .jar 文件运行类,则需要将此 jar 文件添加到类路径中:

java org.somepackage.SomeClass -cp myJarWithSomeClass.jar
于 2013-01-03T03:28:52.607 回答