1. Overview
In this tutorial, We'll learn What does "Could not find or load main class" mean?
A common problem that new Java developers experience is that their programs fail to run with the error message: Could not find or load main class.
What does this mean, what causes it, and how should you fix it?
The problem is with this java run command
javacommand syntax
We have gathered all these solutions from StackOverflow page and arranged in a simple manner to understand easily.
Please read section 2 and 5 to get a clear understanding. Section 3 tells about all areas where we do mistake usually. But, recommend reading the complete article.
For example:
Please read section 2 and 5 to get a clear understanding. Section 3 tells about all areas where we do mistake usually. But, recommend reading the complete article.
2. Error Definition
According to the error message ("Could not find or load main class"), there are two categories of problems:2.1 Main class could not be found
The main class could not be found when there is a typo or wrong syntax in the fully qualified class name or it does not exist in the provided classpath.2.2 Main class could not be loaded
The main class could not be loaded when the class cannot be initiated, typically the main class extends another class and that class does not exist in the provided classpath.For example:
public class YourMain extends org.apache.camel.spring.Main
If camel-spring is not included, this error will be reported.
The normal syntax1 is below:
Note: To solve "Could not find or load main class", we. should go to the starting of the class package folder and run java command with the fully classified class name. Or missing the class in classpath.
3. Java run command syntax
First of all, we need to understand the correct way to launch a program using the java (or javaw) command.The normal syntax1 is below:
java [ <option> ... ] <class-name> [<argument> ...]
<option>: is a command line option - starting with a "-" character
<class-name> is a fully qualified Java class name
<argument> is an arbitrary command line argument that gets passed to your application.
The fully qualified name (FQN) for the class is conventionally written as in Java source code.
e.g.
<class-name> is a fully qualified Java class name
<argument> is an arbitrary command line argument that gets passed to your application.
The fully qualified name (FQN) for the class is conventionally written as in Java source code.
e.g.
packagename.packagename2.packagename3.ClassName
However, some versions of the java command allow you to use slashes instead of periods.
e.g.
e.g.
packagename/packagename2/packagename3/ClassName
which (confusingly) looks like a file pathname but isn't one. Note that the term fully qualified name is standard Java terminology ... not something I just made up to confuse you :-)
Here is an example of what a java command should look like:
Here is an example of what a java command should look like:
java -Xmx100m com.java.w3schools.ListUsers jhon peter
where -Xmx indicates the maximum allocated memory for this run.
The above command performs the following steps when we run command.
A) Search for the compiled version of the com.java.w3schools.ListUsers class.
B) Load the class.
C) Check that the class has a main method with signature, return type and modifiers given by public static void main(String[]). (Note, the method argument's name is NOT part of the signature.)
D) Call that method passing it the command line arguments ("Jhon", "Peter") as a String[] and passed to the main method.
4. Reasons why Java cannot find the class
When we get the message "Could not find or load main class ...", that means that the first step A has failed. The java command was not able to find the class.
4.1 You made a mistake with the class name argument
Example #1 - a simple class name
java ListUser
When the class is declared in a package such as com.acme.example, then you must use the full class name including the package name in the java command; e.g.
java com.java.w3schools.ListUser
Example #2 - a filename or pathname rather than a class name
java ListUser.class java com/java/example/ListUser.class
Example #3 - a class name with the case type incorrect
java com.java.w3schools.listuser
Example #4 - a typo
java com.java.w3schools.mistuser
java ListUser.java
Example #6 - you forgot the class name entirely
java "jhon" "peter" -> lots of arguments
4.2 The application's classpath is incorrectly specified
The second likely cause is that the class name is correct, but that the java command cannot find the class. To understand this, you need to understand the concept of the "classpath". This is explained well by the Oracle documentation:
The java command documentation
Setting the Classpath.
The Java Tutorial - PATH and CLASSPATH
To give a concrete example, supposing that:
you want to run com.java.w3schools.Foon class,
the full file path is /usr/local/java/classes/com/java/w3schools/Foon.class
your current working directory is /usr/local/java/classes/com/java/w3schools/
# wrong, FQN is needed java Foon # wrong, there is no com/java/w3schools` folder in the current working directory java com.java.w3schools.Foon # wrong, similar to above java -classpath . com.java.w3schools.Foon # fine; relative classpath set java -classpath ../../.. com.java.w3schools.Foon # fine; absolute classpath set java -classpath /usr/local/java/classes com.java.w3schools.Foon
4.3 Dependencies Missing from Classpath
The classpath needs to include all of the other (non-system) classes that your application depends on. (The system classes are located automatically, and you rarely need to concern yourself with this.) For the main class to load correctly, the JVM needs to find:
A) The class itself.
B) All classes and interfaces in the superclass hierarchy (e.g. see Java class is present in classpath but startup fails with Error: Could not find or load main class)
C) All classes and interfaces that are referred to by means of variable or variable declarations, or method call or field access expressions.
4.4 The class has been declared in the wrong package
It occasionally happens that someone puts a source code file into the wrong folder in their source code tree, or they leave out the package declaration. If you do this in an IDE, the IDE's compiler will tell you about this immediately. Similarly, if you use a decent Java build tool, the tool will run javac in a way that will detect the problem. However, if you build your Java code by hand, you can do it in such a way that the compiler doesn't notice the problem, and the resulting ".class" file is not in the place that you expect it to be.
5. Another Example to Java Newbie
If the compiled classes are in packages then we have to cd to the root directory of the project and run using the fully qualified name of the class (packageName.MainClassName).
Example:
My classes are in here:
D:\project\com\cse\
The fully qualified name of my main class is:
So I cd back to the root project directory:com.cse.Main
D:\project
Then issue the java command:
java com.cse.Main
This answer is for rescuing newbie java programmers from the frustration caused by a common mistake, I recommend you read the accepted answer for more in-depth knowledge about the java classpath.
6. Conclusion
In this post, We have discussed a problem "Error: Could not find or load main class". Every Java programmer must have seen this when they are new to the java.
And seen the common error-prone areas for this problem and provided solutions.
Original Article
No comments:
Post a Comment
Please do not add any spam links in the comments section.