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
As a beginner you might encounter a very similar scenario where the error output is the same. You try to compile and run your simple program(without having any package set) and you do this:
This will give you the same java.lang.NoClassDefFoundError since java thinks HelloWorld is your package and class your class name. To solve it just use
See the Java page - Lesson: Common Problems (and Their Solutions)
You've put your class in a package named "main", but you're trying to treat it like it isn't in a package. Since you put
package main;
at the top of your source file, you need to put HelloWorld.java in ./main, then runjavac ./main/HelloWorld.java
, followed byjava -cp . main.HelloWorld
.These commands will get you the working example you're trying to build:
This means that your class resides in the
main
package, and its canonical name ismain.HelloWorld
.Java requires that package names should also be mirrored in the directory structure. This means that:
HelloWorld.java
file should be in a directory namedmain
javac
andjava
from the directory containingmain
, not frommain
itselfmain
directory is, notmain
itselfjava
expects the canonical name of the class to execute, somain.HelloWorld
So, to recap:
You should have something like
myproject/main/HelloWorld.java
From
myproject
, runjavac main/HelloWorld.java
From
myproject
, runjava -cp ./ main.HelloWorld
Problem: Basically, the Exception in thread "main"
java.lang.NoClassDefFoundError
:means, that the class which you are trying to run was not found in the classpath.
Solution: you need to add the class or
.jar
file which contains this class into the java classpath. When you are running a java class from the command line, you need to add the dot (.)into the classpath which tells the JVM to search for classes in actual directory.
If you are running a class from a .jar file, you need to add this jar file into the classpath: