Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
like image 924
retrohacker Avatar asked Jan 03 '13 03:01

retrohacker


People also ask

How do I fix Java Lang NoClassDefFoundError error?

You can fix NoClassDefFoundError error by checking following: Check the exception stack trace to know exactly which class throw the error and which is the class not found by java.

What is Exception in thread main Java Lang NoClassDefFoundError?

NoClassDefFoundError is a common error in Java that occurs if a ClassLoader cannot find a particular class in the classpath while trying to load it. The Exception in thread "main" suggests that this error has occurred in the main thread, the thread which is responsible for running the Java application.

How do I get rid of NoClassDefFoundError in Java?

NoClassDefFoundError, which means the Class Loader file responsible for dynamically loading classes can not find the . class file. So to remove this error, you should set your classpath to the location where your Class Loader is present. Hope it helps!!


1 Answers

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

like image 88
Sergiu Dumitriu Avatar answered Oct 09 '22 22:10

Sergiu Dumitriu