1. Overview
Occasionally when we run a Java program, we might see “Could not find or load main class.” It’s easy to guess the reason: The JVM failed to find the main class and gave this error. But why couldn’t it?
In this tutorial, we’ll discuss the probable reasons for failure to find the main class. We’ll also see how to fix them.
2. Sample Program
We’ll start with a HelloWorld program:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world..!!!");
}
}
Now let’s compile it:
$ javac HelloWorld.java
Here, the compiler will generate a .class file for our program. This .class file will be generated in the same directory. The .class file will have the same name as the class name given in the Java program. This .class file is executable.
In the following sections, we’ll run this .class file and try to understand the probable reasons for error “Could not find or load main class.”
3. Wrong Class Name
To run a .class file generated by Java compiler, we can use this command:
java <.class filename>
Now let’s run our program:
$ java helloworld
Error: Could not find or load main class helloworld
And it failed with the error “Could not find or load main class helloworld.”
As discussed earlier, the compiler will generate the .class file with the exact same name given to the Java class in the program. So in our case, the main class will have the name HelloWorld, not helloworld.
Let’s give it one more try with correct casing:
$ java HelloWorld
Hello world..!!!
This time it ran successfully.
3.1. File Extension
To compile a Java program, we must provide the file name with its extension (.java):
$ javac HelloWorld.java
But to run a .class file, we need to provide the class name, not the file name. So there is no need to provide the .class extension:
$ java HelloWorld.class
Error: Could not find or load main class HelloWorld.class
Again, let’s run our program using the correct class name:
$ java HelloWorld
Hello world..!!!
4. Java Package Names
In Java, we keep similar classes together in what we call a package.
Let’s move HelloWorld class into the com.baeldung package:
package com.baeldung;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world..!!!");
}
}
Now let’s compile and run the updated HelloWorld program like before:
$ java HelloWorld
Error: Could not find or load main class HelloWorld
But again, we get the error “Could not find or load main class HelloWorld.”
Let’s try to understand what we missed here.
To run a Java class that is in a package, we must provide its fully qualified name. So in our case, HelloWorld‘s fully qualified name is com.baeldung.HelloWorld.
Now, when we created com.baeldung package, we actually created this folder structure:
com/baeldung/HelloWorld.java
First, let’s try to run our program from the com/baeldung directory:
$ java com.baeldung.HelloWorld
Error: Could not find or load main class com.baeldung.HelloWorld
Still, we are not able to run our program.
Here, when we specified the fully qualified class name com.baeldung.HelloWorld, Java tried to find the HelloWorld.class file in com/baeldung, under the directory from where we were running the program.
As we were already inside com/baeldung, Java failed to find and run the HelloWorld program.
Now let’s move back to the parent folder and run it:
$ java com.baeldung.HelloWorld
Hello world..!!!
And we are again able to say “Hello” to the world.
5. Invalid Classpath
Before going ahead, let’s first understand what the classpath is. It’s the set of classes available to our currently running JVM.
We use the classpath variable to tell the JVM where to find the .class files on the file system.
While running a program, we can provide the classpath using -classpath option:
java -classpath /my_programs/compiled_classes HelloWorld
Here, Java will look for the HelloWorld.class file in /my_programs/compiled_classes folder, a folder whose name we just made up. By default, the classpath variable is set to “.”, meaning the current directory.
In the above section, we changed our directory to run our program. But what if we want to run it from some other folder? That’s when the classpath variable helps us.
To run our program from the directory com/baeldung, we can simply state that our classpath is two directories up — one for each package part:
$ java -claspath ../../ com.baeldung.HelloWorld
Hello world..!!!
Here, “..” represents the parent directory. In our case “../../” represents the top of our package hierarchy.
6. Conclusion
In this article, we learned the probable reasons for the error “Could not find or load main class.”
Then, of course, we also learned how to solve this error.