java - 线程 "main"java.lang.NoClassDefFoundError : HelloWorld 中的异常

标签 java linux compilation terminal

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

我第一次尝试从终端编写和编译 java 程序(到目前为止,我一直在使用 Eclipse 进行 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

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

Exception in thread "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

最佳答案

package main;

这意味着您的类位于 main 包中,其规范名称为 main.HelloWorld

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

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

所以,回顾一下:

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

myproject,运行javac main/HelloWorld.java

myproject 运行 java -cp ./main.HelloWorld

关于java - 线程 "main"java.lang.NoClassDefFoundError : HelloWorld 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132602/

相关文章:

c++ - 为什么我会收到此错误消息 : "undefined reference to ` PerformChat(char*, char*, char*, char*, char* )'"

java - Android 应用程序在使用 Web View 的 onCreateView 期间未按预期设置变量

java - 编译 JNLP 时出现包 javax.jnlp 不存在错误

linux - 使用 KMS 设置控制台视频分辨率

java - Java Card 中的 Exp 文件和小程序依赖项

php - 安装期间找不到 MediaWiki 的数据库驱动程序

java - ActivityUnitTestCase getActionBar() 返回 null

java - 面对 EDT 如何管理游戏状态?

linux - 在 Red Hat Enterprise Linux Server 6.4 Santiago 上安装 node-oracle

c - bash、sh、ps 在 Linux 中如何工作?