Pages

Wednesday, July 3, 2019

[Fixed] Error: Could not find or load main class

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

java  command syntax

We have gathered all these solutions from StackOverflow page and arranged in a simple manner to understand easily.

[Fixed] Error: Could not find or load main class


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.

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.

packagename.packagename2.packagename3.ClassName

However, some versions of the java command allow you to use slashes instead of periods.

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:

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

Example #5 - a source filename

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:

com.cse.Main

So I cd back to the root project directory:

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.