Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
486 views
in Technique[技术] by (71.8m points)

linux - Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld

I've been working on this for about an hour and thumbing through Q&As on stackoverflow but I haven't found a proposed solution to my problem. I'm sorry if this is a duplicate, but I couldn't find any duplicate question with an answer that solved my specific problem.

I am trying to write and compile a java program from terminal for the first time (up until this point I have been using Eclipse for java and VIM for everything else, but I feel its time to switch entirely to VIM). Here is my current HelloWorld code:

package main;

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

I compile and run using the following commands (specifying the classpath to ensure that isn't the problem):

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

This gives me the following error message:

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)

I know it is seeing the file HelloWorld.class and trying to access the class HelloWorld because if I change the run command to:

java -cp "./" Foo

I get an entirely different error message:

Error: Could not find or load main class Foo

I have tried several dozen pages worth of troubleshooting and come up short, including the following:

Exception in thread "main" java.lang.NoSuchMethodError: main

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

java -version yields:

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)

My operating system is LinuxMint and uname -a yields:

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

package main;

This means that your class resides in the main package, and its canonical name is main.HelloWorld.

Java requires that package names should also be mirrored in the directory structure. This means that:

  1. Your HelloWorld.java file should be in a directory named main
  2. You should execute javac and java from the directory containing main, not from main itself
  3. The classpath should contain the directory where the main directory is, not main itself
  4. java expects the canonical name of the class to execute, so main.HelloWorld

So, to recap:

You should have something like myproject/main/HelloWorld.java

From myproject, run javac main/HelloWorld.java

From myproject, run java -cp ./ main.HelloWorld


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...