What does "Could not find or load main class" mean?
Asked Answered
V

64

1901

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?

Vernverna answered 7/8, 2013 at 3:2 Comment(1)
Please note that this is a "self-answer" question that is intended to be a generic reference Q&A for new Java users. I could not find an existing Q&A that covers this adequately (IMO).Vernverna
V
1628

The java <class-name> command syntax

First of all, you need to understand the correct way to launch a program using the java (or javaw) command.

The normal syntax1 is this:

    java [ <options> ] <class-name> [<arg> ...]

where <option> is a command line option (starting with a "-" character), <class-name> is a fully qualified Java class name, and <arg> is an arbitrary command line argument that gets passed to your application.


1 - There are some other syntaxes which are described near the end of this answer.

The fully qualified name (FQN) for the class is conventionally written as you would 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.acme.example.ListUsers fred joe bert

The above is going to cause the java command to do the following:

  1. Search for the compiled version of the com.acme.example.ListUsers class.
  2. Load the class.
  3. 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.)
  4. Call that method passing it the command line arguments ("fred", "joe", "bert") as a String[].

Reasons why Java cannot find the class

When you get the message "Could not find or load main class ...", that means that the first step has failed. The java command was not able to find the class. And indeed, the "..." in the message will be the fully qualified class name that java is looking for.

So why might it be unable to find the class?

Reason #1 - you made a mistake with the classname argument

The first likely cause is that you may have provided the wrong class name. (Or ... the right class name, but in the wrong form.) Considering the example above, here are a variety of wrong ways to specify the class name:

  • 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 classname including the package name in the java command; e.g.

    java com.acme.example.ListUser
    
  • Example #2 - a filename or pathname rather than a class name:

    java ListUser.class
    java com/acme/example/ListUser.class
    
  • Example #3 - a class name with the casing incorrect:

    java com.acme.example.listuser
    
  • Example #4 - a typo

    java com.acme.example.mistuser
    
  • Example #5 - a source filename (except for Java 11 or later; see below)

    java ListUser.java
    
  • Example #6 - you forgot the class name entirely

    java lots of arguments
    

Reason #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:

So ... if you have specified the class name correctly, the next thing to check is that you have specified the classpath correctly:

  1. Read the three documents linked above. (Yes ... READ them! It is important that a Java programmer understands at least the basics of how the Java classpath mechanisms works.)
  2. Look at command line and / or the CLASSPATH environment variable that is in effect when you run the java command. Check that the directory names and JAR file names are correct.
  3. If there are relative pathnames in the classpath, check that they resolve correctly ... from the current directory that is in effect when you run the java command.
  4. Check that the class (mentioned in the error message) can be located on the effective classpath.
  5. Note that the classpath syntax is different for Windows versus Linux and Mac OS. (The classpath separator is ; on Windows and : on the others. If you use the wrong separator for your platform, you won't get an explicit error message. Instead, you will get a nonexistent file or directory on the path that will be silently ignored.)

Reason #2a - the wrong directory is on the classpath

When you put a directory on the classpath, it notionally corresponds to the root of the qualified name space. Classes are located in the directory structure beneath that root, by mapping the fully qualified name to a pathname. So for example, if "/usr/local/acme/classes" is on the class path, then when the JVM looks for a class called com.acme.example.Foon, it will look for a ".class" file with this pathname:

  /usr/local/acme/classes/com/acme/example/Foon.class

If you had put "/usr/local/acme/classes/com/acme/example" on the classpath, then the JVM wouldn't be able to find the class.

Reason #2b - the subdirectory path doesn't match the FQN

If your classes FQN is com.acme.example.Foon, then the JVM is going to look for "Foon.class" in the directory "com/acme/example":

  • If your directory structure doesn't match the package naming as per the pattern above, the JVM won't find your class.

  • If you attempt rename a class by moving it, that will fail as well ... but the exception stacktrace will be different. It is liable to say something like this:

    Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
    

    because the FQN in the class file doesn't match what the class loader is expecting to find.

To give a concrete example, supposing that:

  • you want to run com.acme.example.Foon class,
  • the full file path is /usr/local/acme/classes/com/acme/example/Foon.class,
  • your current working directory is /usr/local/acme/classes/com/acme/example/,

then:

# wrong, FQN is needed
java Foon

# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon

# wrong, similar to above
java -classpath . com.acme.example.Foon

# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

Notes:

  • The -classpath option can be shortened to -cp in most Java releases. Check the respective manual entries for java, javac and so on.
  • Think carefully when choosing between absolute and relative pathnames in classpaths. Remember that a relative pathname may "break" if the current directory changes.

Reason #2c - dependencies missing from the 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:

(Note: the JLS and JVM specifications allow some scope for a JVM to load classes "lazily", and this can affect when a classloader exception is thrown.)

Reason #3 - the class has been declared in the wrong package

It occasionally happens that someone puts a source code file into the 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.

Still can't find the problem?

There lots of things to check, and it is easy to miss something. Try adding the -Xdiag option to the java command line (as the first thing after java). It will output various things about class loading, and this may offer you clues as to what the real problem is.

Also, consider possible problems caused by copying and pasting invisible or non-ASCII characters from websites, documents and so on. And consider "homoglyphs", where two letters or symbols look the same ... but aren't.

You may run into this problem if you have invalid or incorrect signatures in META-INF/*.SF. You can try opening up the .jar in your favorite ZIP editor, and removing files from META-INF until all you have is your MANIFEST.MF. However this is NOT RECOMMENDED in general. (The invalid signature may be the result of someone having injected malware into the original signed JAR file. If you erase the invalid signature, you are in infecting your application with the malware!) The recommended approach is to get hold of JAR files with valid signatures, or rebuild them from the (authentic) original source code.

Finally, you can apparently run into this problem if there is a syntax error in the MANIFEST.MF file (see https://mcmap.net/q/45817/-cannot-run-jar-file-due-to-cannot-load-main-class-error).


Alternative syntaxes for java

There are three alternative syntaxes for the launching Java programs using the java command.

  1. The syntax used for launching an "executable" JAR file is as follows:

    java [ <options> ] -jar <jar-file-name> [<arg> ...]
    

    e.g.

    java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
    

    The name of the entry-point class (i.e. com.acme.example.ListUser) and the classpath are specified in the MANIFEST of the JAR file. Anything you specify as a classpath on the command line is ignored with this syntax: only the Class-Path entry in the Manifest is used (and, transitively, those in any JAR files referenced by this entry). Note also that URLs in this Class-Path are relative to the location of the JAR it is contained in.

  2. The syntax for launching an application from a module (Java 9 and later) is as follows:

    java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
    

    The name of the entrypoint class is either defined by the <module> itself, or is given by the optional <mainclass>.

  3. From Java 11 onwards, you can use the java command to compile and run a single source code file using the following syntax:

    java [ <options> ] <sourcefile> [<arg> ...]
    

    where <sourcefile> is (typically) a file with the suffix ".java".

For more details, please refer to the official documentation for the java command for the Java release that you are using.


IDEs

A typical Java IDE has support for running Java applications in the IDE JVM itself or in a child JVM. These are generally immune from this particular exception, because the IDE uses its own mechanisms to construct the runtime classpath, identify the main class and create the java command line.

However it is still possible for this exception to occur, if you do things behind the back of the IDE. For example, if you have previously set up an Application Launcher for your Java app in Eclipse, and you then moved the JAR file containing the "main" class to a different place in the file system without telling Eclipse, Eclipse would unwittingly launch the JVM with an incorrect classpath.

In short, if you get this problem in an IDE, check for things like stale IDE state, broken project references or broken launcher configurations.

It is also possible for an IDE to simply get confused. IDE's are hugely complicated pieces of software comprising many interacting parts. Many of these parts adopt various caching strategies in order to make the IDE as a whole responsive. These can sometimes go wrong, and one possible symptom is problems when launching applications. If you suspect this could be happening, it is worth trying other things like restarting your IDE, rebuilding the project and so on.


Other References

Vernverna answered 7/8, 2013 at 3:2 Comment(20)
I had this problem when I was trying to run a Class with a 3rd party library. I invoked java like this: java -cp ../third-party-library.jar com.my.package.MyClass; this does not work, instead it is necessary to add the local folder to the class path as well (separated by :, like this: java -cp ../third-party-library.jar:. com.my.package.MyClass, then it should workGeny
After years of java programming I still managed to end up on this page. For me the issue was that the classpath syntax is OS-dependent. I'm kind of new to programming on Windows and had no idea.Flatiron
Additional notes, point 2 save me! It is sad to see that java does not say it does not find an imported class, but instead the main class you're trying to run. This is misleading, although I'm sure there's a reason for that. I had the case where java knew exactly where my class is, however it couldn't find one of the imported classes. Instead of saying that, it complained about not finding my main class. Really, annoing.Monarda
I had this problem twice in Eclipse. First time the signature of main() was wrong. Second time I have renamed a .jar, and even though I added the new one to the build path, Eclipse didn't find the old one, so the project didn't compile, with this error. I had to remove the .jar file from Project > Properties > Java Build Path > Libraries.Weanling
I've encountered it a third time. I've run the program from a Windows 10 batch file, and put the .jar name in a variable (called with "-cp %jarname%;lib*"). I've mistakenly put an extra space at the end of the jarname, and it caused the error. Hat trick :)Weanling
In my case, with spark2-submit, Error: Could not find or load main class = without a class name in the error statement was caused by a spark.properties file error where I had spaces around the = sign in spark.driver.extraJavaOptions -Dlog4j.configuration = log4j.propertiesdeclared as part of the spark2-submit cmd line option --files hdfs://.../log4j.properties. Removing all the spaces fixed in all similar lines fixed that issue.Topliffe
@lanoxx: I agree this is confusing as the default behavior when not setting the classpath is to include current directory. If you set classpath, this default is overwritten with the classpath you declare. Reason being you may not want to include the CWD--often to prevent unwanted/unknown class from being loaded.Barytone
I needed to include the current dir and use ; instead of :Mackinaw
It was revelation to me that using the -cp option on the commandline by itself was not sufficient if the variable CLASSPATH is never set, e.g. on a newly configured machine. Once I defined in the shell, everything worked. Who would have thought!Endotoxin
I read this entire post and learned so much, and what actually worked for me was the very last line - "it is worth trying other things like restarting your IDE". LOLTabatha
Amazingly detailed comment. My issue was 2c, couldn't find it elsewhere. Thanks for the help.Laodicea
Very Detailed Explanation. Appreciate the Patience!! For me, in eclipse IDE, clean and rebuilding the project resolved the issue.Clarkin
Reason #2b is what probably most beginners are struggling with - if you are used to .Net it might seems strange first that the directory structure should mattersLeucoma
Actually, based on my observation (of people asking questions that are closed as dups of this one) #2b is pretty infrequent. #2 and #2a are far more common.Vernverna
@StephenC. Amazing answer. It deserves even more votes. One question: for #3c, "all classes and interfaces that are referred to by means of variable or variable declarations, or method call or field access expressions". I think this might not always the case. In fact, like what you mentioned after that point, sometimes JVM will try to load class only if they are explicitly referenced. If a library is missing in the classpath, as long as program never execute code that interacts (either directly or indirectly) w/ classes from that library. The program should work fine w/o any issueInaction
I don't know lots about java compiler, but I guess it is because java compiler will never attempt to statically link everything together. Library classes are usually dynamically loaded into JVM during runtimeInaction
Yes, that is true. Symbolic references (to other classes) may only be resolved on their first use, and this may effect when the JVM throws an exception reporting a missing class. I addressed that in the paragraph following the text that you quoted / commented on.Vernverna
What a thorough answer! You even got the rare Reason #2c. I had that one once and it stumped me for a while.Torque
Great answer! Various sections have helped me out over the years (depending on my exact issue). However, most recently I had to resolve this by following the answer stated here: https://mcmap.net/q/45819/-quot-invalid-signature-file-quot-when-attempting-to-run-a-jarKelleher
I just ran into this because I was using a tool (Jib) that generated the command as java -cp @file-containing-classpath MyClass. Turns out that some (older) versions of Java don't support that syntax; I changed it to java -cp $(cat file-containing-classpath) MyClass instead.Calli
G
303

If your source code name is HelloWorld.java, your compiled code will be HelloWorld.class.

You will get that error if you call it using:

java HelloWorld.class

Instead, use this:

java HelloWorld
Goofball answered 21/5, 2014 at 11:6 Comment(10)
The problem is that this solution only works for Java classes declared in the default package with no JAR file dependencies. (And even then, not all of the time.) Most Java programs are not that simple.Vernverna
like Stephen said, this only works with "default package" - which means no package declaration at the top of the file. For a quick test of some code, I did: javac TestCode.java followed by java TestCodePentateuch
This did not work for me. It still says, "Could not find or load main class HelloWorld"Mastat
java -jar HelloWorld.jar is also an optionDarren
I needed to to do java -classpath . HelloWorldFeliciafeliciano
@Mastat - did you read my comment? If this doesn't work, then one or more of the preconditions is not satisfied. Look at the top-voted answer.Vernverna
@ChrisPrince - Yes ... that works ... sometimes. To understand when it works, and when it doesn't work, read the top-voted answer.Vernverna
@BMaximus - That is only an option if you have an executable JAR file ...Vernverna
How to run using java <Filename> @ChrisPrinceHoneysweet
@ShubhamSinghvi - See "Alternative syntaxes for java: #3". (Java 11 onwards). The filename is a source code filename; i.e. a ".java" file. (You can't do that with a ".class" file ...)Vernverna
C
179

If your classes are in packages then you have to cd to the root directory of your 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.

Curren answered 6/3, 2015 at 3:20 Comment(6)
This answer makes a whole load of assumptions. And there are other ways to achieve this. Instead of blindly following the above advice, I would recommend that people take the time to read the links in my Answer that explain how the Java classpath works. It is better to UNDERSTAND what you are doing ...Vernverna
This answer makes the exact assumptions that I needed :) I was located in the directory of the .class file and java.exe wasn't working. Once I cd-ed above and ran with the package name included in the command line it worked.Shebeen
I agree with Nick Constantine. Same here. It was an exact example that followed the steps I made, and it worked for me too. The java classpath handling has a certain logic, but I sure wouldn't have designed it that way.Kirchhoff
Tnanks, your answer help me to look that i used Main with Uppercase _!Schwerin
I'm writing this comment after trying this but it didn't work. I've a project named Helloworld which consist only 1 java file, Helloworld/src/com/firstpackage/Test.java (windows 10. intellij idea). I don't have CLASSPATH environmental variable, i want to set classpath specifically for this project. running java com.firstpackage.Test inside Helloworld directory doesn't work and neither does the command java -classpath C:\Users\matuagkeetarp\IdeaProjects\Helloworld\src\com\first‌​package Test.java set classpath variable. Can you help?Ozone
@PrateekGautam - You probably need to read the comprehensive answer above. (And thanks for demonstrating my point :-) )Vernverna
H
117

With keyword 'package'

If you have a package keyword in your source code (the main class is defined in a package), you should run it over the hierarchical directory, using the full name of the class (packageName.MainClassName).

Assume there is a source code file (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

For running this code, you should place Main.Class in the package like directory:

C:\Users\workspace\testapp\com\test\Main.Java

Then change the current directory of the terminal to the root directory of the project:

cd C:\Users\workspace\testapp

And finally, run the code:

java com.test.Main

Without keyword 'package'

If you don't have any package on your source code name maybe you are wrong with the wrong command. Assume that your Java file name is Main.java, after compile:

javac Main.java

your compiled code will be Main.class

You will get that error if you call it using:

java Main.class

Instead, use this:

java Main
Hone answered 27/10, 2014 at 12:7 Comment(7)
See "Additional Notes #1" of my Answer. For a better explanation of this problem.Vernverna
@StephenC Yes, your answer is more complete (and of course, +1), but this particular answer had the word "package" in it, which allowed me to find what I needed fast. And it worked. So +1 Razavi. StephenC, yours lacks the simple package example I needed as I am new to Java.Afflictive
This was exactly my problem. I have been wading through tons of Java doc and this concrete example is what I neededVirulent
Its better to make 'Runnable JAR File' to execute class file.Hone
Yes, concrete example is nice, this worked perfectly. I'm sure the main answer is very thorough, but it was difficult to see the tree for the forest. Nice one @RazaviDeirdra
I like this shorter and useful answer instead of accepted one!Mila
Feel free to upvote answers that you like. That is the recommended way to express your preferences ... and the way that actually affects the ranking of the answers.Vernverna
V
63

When the same code works on one PC, but it shows the error in another, the best solution I have ever found is compiling like the following:

javac HelloWorld.java
java -cp . HelloWorld
Volatile answered 21/8, 2015 at 6:58 Comment(8)
This is not a good recommendation. You are depending on the CLASSPATH environment variable being unset, or having a value that is consistent with ".". Yes, it works in many cases, but it won't in others.Vernverna
Well certainly javac -classpath . HelloWorld.java would have worked! And that is a better solution in your case.Vernverna
If you have 'package com.some.address' as a first line - this will not work. You will need to comment out 'package address'..Bossy
@Bossy - That hack (commenting out the package) will work (in some cases) but it is a bad idea. A better idea is to learn / understand what caused the problem and implement the correct solution.Vernverna
unsetting the classpath variable basically worked for me.Finnegan
I have set the environment path properly but still java <Filename> shows error and java -cp . <Filename> does not. How to make java <Filename> runtime successfull? @StephenCHoneysweet
@ShubhamSinghvi - What does echo $CLASSPATH say? (Or echo %CLASSPATH% on Windows.)Vernverna
C:\Program Files\Java\jdk-17.0.1\bin;C:\Program Files (x86)\MySQL\mysql-connector-java-8.0.27\mysql-connector-java-8.0.27.jar; I reopened the cmd after changing the classpath and now it works. Thanks for your effort !Honeysweet
M
43

Specifying the classpath on the command line helped me. For example:

  1. Create a new folder, C:\temp

  2. Create file Temp.java in C:\temp, with the following class in it:

     public class Temp {
         public static void main(String args[]) {
             System.out.println(args[0]);
         }
     }
    
  3. Open a command line in folder C:\temp, and write the following command to compile the Temp class:

     javac Temp.java
    
  4. Run the compiled Java class, adding the -classpath option to let JRE know where to find the class:

     java -classpath C:\temp Temp Hello!
    
Meldon answered 2/7, 2014 at 11:11 Comment(6)
In Ubuntu, I also had to specify the path. Don't understand why it can't use the Current Working Directory by default. I'm convinced that Java is sponsored by Keyboard manufacturers!!Casiano
@Casiano - The reason that "." is not in $PATH by default is that it is a security trap. seas.upenn.edu/cets/answers/dot-path.htmlVernverna
Thanks a lot for this......even though not sure why java was not being able to find out the classpath even after setting it in environment variables.Vibraphone
@Vibraphone - The most likely reasons were: 1) java wasn't looking at $CLASSPATH (because you used -classpath or -jar) or 2) the classpath setting was not set in the environment that was not in effect in the context that java was run; e.g. because you didn't "source" the file where added the setenv commands in the right shell.Vernverna
I still got Error: Could not find or load main class Temp could anybody help!Omeara
Under windows using classpath like this java -classpath c:\folder\subfoler\myCodeFolder Main worked for me as well to run Main.class.Loyceloyd
M
29

According to the error message ("Could not find or load main class"), there are two categories of problems:

  1. The Main class could not be found
  2. The Main class could not be loaded (this case is not fully discussed in the accepted answer)

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.

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.

Mucosa answered 17/9, 2015 at 1:35 Comment(11)
"Basically" there are lots of other categories too. And the missing superclass problem is a very unusual subcase. (So unusual that I've never seen it ... in questions asked on this site.)Vernverna
There are TWO because the error says "Could not FIND or LOAD main class". If there are other categories, please advise me. I've seen it, so just want to share it here maybe someone else will need it.Mucosa
Yes. I realize that. But have you read my answer? Doesn't it cover all of the cases that you mentioned? Really my point is that your answer is adding nothing new ... and since it is leaving out all of the many other causes, it is actually going to be a hinderance to a lot of readers.Vernverna
Your answer is good. I read it and am going to read the references. Thanks! It covers the first point pretty well. When it comes to the second point, I think it is not quite right (very happy if I am wrong instead). In your answer you said "The classpath needs to include all of the other (non-system) classes". Actually to avoid the error it is not necessary. There will be other errors and exceptions (NullPionter for example) but you will not see "Coud not find or load main class" as long as main class is found and loaded.Mucosa
There are definitely scenarios where a missing class will result in a different exception. However, I believe that you will get that exception if any missing class causes the main class to fail to load. Not just a missing superclass. It could be any type that is mentioned by the class that you are loading ... or any of its super classes / interfaces.Vernverna
I meant in some (most) cases you don't see THIS error when dependencies are not provided in classpath. Maybe you want to revise "The classpath needs to include all of the other classes". Completely up to you. Not offending.Mucosa
But the fact remains that the classpath DOES need to include all of the other classes. The statement is true, and you have not convinced me that there is any value in revising it. (Indeed, if you think about it, if I revised it to say something like "You don't need >>all<< of the classes on the classpath to avoid this particular error but you will get different errors in some cases so you had better put them on anyway." ... then the typical reader of this answer is likely to get even more confused than he/she already is.)Vernverna
I would have revised it to something like "You need to included all of the classes that is required to initiate the main class to avoid this particular error". I am not trying to convince you. It is just a way that I would like to see. I left the answer here just for people who might like reading things in this way. Let's not extend this discussion further :) I changed my statement to "not fully discussed in the accepted answer" and hope you feel better.Mucosa
This information is crucial and deserves an explicit mention (this is the only answer that mentions extends). I've just learned the hard way that when main class fails to load because it extends another that could not be found, java does not report which actual class was not found (unlike NoClassDefFoundError). So yes it does happen, and it's a hair-pulling situation when you don't know this.Biogen
In this situation is there any way to tell exactly which dependency class is failing to load?Prehension
@carlos Using -Xdiag flag may give you a hint.Synge
C
23

Use this command:

java -cp . [PACKAGE.]CLASSNAME

Example: If your classname is Hello.class created from Hello.java then use the below command:

java -cp . Hello

If your file Hello.java is inside package com.demo then use the below command

java -cp . com.demo.Hello

With JDK 8 many times it happens that the class file is present in the same folder, but the java command expects classpath and for this reason we add -cp . to take the current folder as reference for classpath.

Chongchoo answered 23/2, 2017 at 7:51 Comment(8)
This only works in simple cases. More complicated cases require a more complicated classpath.Vernverna
And for >>really<< simple cases, -cp . is unnecessary, because if $CLASSPATH is unset, then . is the default classpath.Vernverna
No Stephen, many times in Windows default classpath does not work. I tried it out on three different machines, you can try that out as well.Chongchoo
That is probably because you have actually set the %CLASSPATH% environment variable somewhere. If you do that, then you are not using the default classpath. (What does echo %CLASSPATH% output?) And no, I can't check because I don't have a Windows PC.Vernverna
The official Oracle manual entry for the "java" command (Windows version) says this: "If -classpath and -cp are not used and CLASSPATH is not set, then the user class path consists of the current directory (.)." Reference - docs.oracle.com/javase/7/docs/technotes/tools/windows/java.htmlVernverna
Yup, in general when you install tools like Websphere MQ or erlang etc which are common now a days then CLASSPATH creates as environment variable. That is why the guy who asked this question might not be able to compile.Chongchoo
There is no "the guy". This was written (by me!) as a generic Q&A that is intended to educate people, so that they understand the cause of the problem, and know how to fix it. Simple "do this and it might work" answers are (IMO) unhelpful, because they encourage people to not take the time to learn and understandVernverna
This worked for me when I tried to run a simple program from command lineDannie
I
21

Try -Xdiag.

Steve C's answer covers the possible cases nicely, but sometimes to determine whether the class could not be found or loaded might not be that easy. Use java -Xdiag (since JDK 7). This prints out a nice stacktrace which provides a hint to what the message Could not find or load main class message means.

For instance, it can point you to other classes used by the main class that could not be found and prevented the main class to be loaded.

Intermingle answered 24/8, 2016 at 8:13 Comment(0)
S
21

I had such an error in this case:

java -cp lib.jar com.mypackage.Main

It works with ; for Windows and : for Unix:

java -cp lib.jar; com.mypackage.Main
Spavin answered 22/9, 2016 at 7:35 Comment(2)
Yes. That's most likely because your Main is not in the JAR file. -cp lib.jar; means the same thing as -cp lib.jar;. i.e. the current directory is included on the classpath.Vernverna
Finally fixed the issue for unix .. thanks (works with :)Enduring
P
16

Sometimes what might be causing the issue has nothing to do with the main class, and I had to find this out the hard way. It was a referenced library that I moved, and it gave me the:

Could not find or load main class xxx Linux

I just deleted that reference, added it again, and it worked fine again.

Pappus answered 1/11, 2013 at 18:4 Comment(5)
It sounds like the problem was that you had a incorrect classpath due to a broken "reference" in your project in your IDE. I'll update my answer to cover that case.Vernverna
@StephenC and EduardoDennis, It was that here too, there was a jar missing, that jar contained an interface that the main class depended on to be instantiated. So, the error message is too broad. I should say "could not find" if the class file is not found and "could not load (missing dependencies)" if there is something else missing but not the file itself, so the error message being too broad is missleading if you focus only on the "find" part of it :(Optometer
@AquariusPower - There should have been an additional "caused by" stacktrace for the "cause" exception that said wht class was missing. If you want to suggest to the Java developers that they change an error message that has been saying that for 20+ years ... feel free. (I think that the error message is correct. The problem was that >>you<< narrowed in on the wrong clause.)Vernverna
@StephenC what I meant is, they surely have access to the information if the main class file is available or not, so why not show us a better error message saying that such file is missing. In the other hand, they could also say "The file was found but could not be loaded" at that point, we would promptly focus on dependencies instead of losing half a day researching and testing things to understand. Just that I meant :). They may do it in a limited way for 20+ years, but they can improve it and we are here to grant that will happen thru our criticism and complaints! :DOptometer
Please understand what >>I<< meant. Complaining about it in some obscure comment on 3 year old Q&A is not going to achieve anything. The people who might concievably act on your complaints won't notice it. If you want to do something constructive, submit a patch. (I don't rate your chances, but they will be greater than if you just whinge about it.)Vernverna
S
13

I had same problem and finally found my mistake :) I used this command for compiling and it worked correctly:

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

But this command did not work for me (I could not find or load the main class, qrcode):

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

Finally I just added the ':' character at end of the classpath and the problem was solved:

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
Sombrous answered 18/3, 2019 at 6:19 Comment(0)
K
10

In this instance you have:

Could not find or load main class ?classpath

It's because you are using "-classpath", but the dash is not the same dash used by java on the command prompt. I had this issue copying and pasting from Notepad to cmd.

Klepht answered 30/6, 2015 at 7:56 Comment(1)
Wow! That is a totally bizarre cause! (But it serves you right for using Notepad instead of a real text editor :-) )Vernverna
L
10

If you use Maven to build the JAR file, please make sure to specify the main class in the pom.xml file:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>class name us.com.test.abc.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
Lambency answered 15/6, 2017 at 16:19 Comment(0)
C
9

In my case, the error appeared because I had supplied the source file name instead of the class name.

We need to supply the class name containing the main method to the interpreter.

Camphene answered 12/3, 2014 at 0:37 Comment(1)
Yes. See my example #2 of the wrong ways to specify the class name!!Vernverna
T
9

All answers here are directed towards Windows users it seems. For Mac, the classpath separator is :, not ;. As an error setting the classpath using ; is not thrown then this can be a difficult to discover if coming from Windows to Mac.

Here is corresponding Mac command:

java -classpath ".:./lib/*" com.test.MyClass

Where in this example the package is com.test and a lib folder is also to be included on classpath.

Traduce answered 4/10, 2016 at 16:8 Comment(3)
On Linux just as on Mac.Oglesby
Why /* is necessary?Oglesby
It is a wildcard syntax. (It is not mandatory. You can explicitly list the JARs if you want to.)Vernverna
W
9

Enter image description here

Class file location: C:\test\com\company

File Name: Main.class

Fully qualified class name: com.company.Main

Command line command:

java  -classpath "C:\test" com.company.Main

Note here that class path does not include \com\company.

Watchmaker answered 26/3, 2017 at 21:17 Comment(0)
C
8

This might help you if your case is specifically like mine: as a beginner I also ran into this problem when I tried to run a Java program.

I compiled it like this:

javac HelloWorld.java

And I tried to run also with the same extension:

java Helloworld.java

When I removed the .java and rewrote the command like java HelloWorld, the program ran perfectly. :)

Contumely answered 1/6, 2017 at 10:36 Comment(2)
This is because you are executing the compiled version of your .java. It is actually executing the .class fileApiculate
For the record, this is the same as Reason #1, Example #5 in my Answer ...Vernverna
T
7

I thought that I was somehow setting my classpath incorrectly, but the problem was that I typed:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

instead of:

java -cp C:/java/MyClasses utilities/myapp/Cool   

I thought the meaning of fully qualified meant to include the full path name instead of the full package name.

Talon answered 2/9, 2015 at 5:58 Comment(2)
I've updated my answer to try to address that confusion.Vernverna
Neither of these is correct. The class must be given as utilities.myapp.Cool or whatever its package name is, if any.Eleanoraeleanore
O
6

When running the java with the -cp option as advertised in Windows PowerShell you may get an error that looks something like:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

In order to for PowerShell to accept the command, the arguments of the -cp option must be contained in quotes as in:

java -cp 'someDependency.jar;.' ClassName

Forming the command this way should allow Java process the classpath arguments correctly.

Ola answered 21/5, 2017 at 8:9 Comment(0)
I
5

On Windows put .; at the CLASSPATH value in the beginning.

The . (dot) means "look in the current directory". This is a permanent solution.

Also you can set it "one time" with set CLASSPATH=%CLASSPATH%;.. This will last as long as your cmd window is open.

Inartistic answered 24/10, 2015 at 21:18 Comment(1)
This advice may or may not help. It will help if the class tree containing the classes in the current directory. It won't if they are not. I actually wouldn't do this. Instead I would create a one-liner wrapper script that worked whether or not the user is in the "right" directory.Vernverna
I
5

This is a specific case:

Windows (tested with Windows 7) doesn't accept special characters (like á) in class and package names. Linux does, though.

I found this out when I built a .jar in NetBeans and tried to run it in command line. It ran in NetBeans, but not on the command line.

Idalla answered 27/12, 2015 at 0:26 Comment(0)
K
5

What fixed the problem in my case was:

Right click on the project/class you want to run, and then Run AsRun Configurations. Then you should either fix your existing configuration or add a new one in the following way:

Open the Classpath tab, click on the Advanced... button, and then add bin folder of your project.

Kessia answered 16/1, 2016 at 10:26 Comment(0)
O
5

I also faced similar errors while testing a Java MongoDB JDBC connection. I think it's good to summarize my final solution in short so that in the future anybody can directly look into the two commands and are good to proceed further.

Assume you are in the directory where your Java file and external dependencies (JAR files) exist.

Compile:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp - classpath argument; pass all the dependent JAR files one by one
  • *.java - This is the Java class file which has main method. sdsd

Run:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Please do observe the colon (Unix) / comma (Windows) after all the dependency JAR files end
  • At the end, observe the main class name without any extension (no .class or .java)
Ordinarily answered 26/1, 2018 at 20:15 Comment(1)
This all assumes that 1) JavaMongoDBConnection has no package, and 2) you don't change directory. It is, to say the least, fragile. And by not explaining the issues, it will lead newbies to try this approach in situations where it won't work. In short, it encourages "voodoo programming techniques": en.wikipedia.org/wiki/Voodoo_programmingVernverna
B
4

First set the path using this command;

set path="paste the set path address"

Then you need to load the program. Type "cd (folder name)" in the stored drive and compile it. For Example, if my program stored on the D drive, type "D:" press enter and type " cd (folder name)".

Bobette answered 2/12, 2013 at 14:5 Comment(4)
This does not help. This Question is about Java programs, not ordinary executables. Java does not use PATH to locate anything, and if "cd" helps then it by luck rather than by judgement.Vernverna
if "cd" helps then it by luck rather than by judgement. This is wrong (I believe), as java uses the current directory . as part of the classpath by default.Rasheedarasher
@Rasheedarasher - That's what I mean. Unless you know that you are using the default classpath (or a classpath with "." on it), "cd" will have no effect. This solution works more by luck (i.e. guessing / hoping that "." is on the classpath) than by judgement (i.e. checking that "." is on the classpath). Furthermore you are incorrect about the default. Java uses "." as the classpath by default, not as part of the classpath by default.Vernverna
On Windows, presumably?Trimble
A
4

In Java, when you sometimes run the JVM from the command line using the Java interpreter executable and are trying to start a program from a class file with public static void main (PSVM), you might run into the below error even though the classpath parameter to the JVM is accurate and the class file is present on the classpath:

Error: main class not found or loaded

This happens if the class file with PSVM could not be loaded. One possible reason for that is that the class may be implementing an interface or extending another class that is not on the classpath. Normally if a class is not on the classpath, the error thrown indicates as such. But, if the class in use is extended or implemented, Java is unable to load the class itself.

Reference: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/

Alben answered 18/9, 2015 at 3:1 Comment(3)
Did you read the accepted answer? Does your answer add anything new?Vernverna
@StephenC I've tried to find a reason in your list by looking at "Reason" categories and their points. I couldn't find the matching point in "Reason #1" and "Reason #2" title didn't look close to my case (because I was sure there is no problem with classpath itself). I've found the reason by performing experiments and I was surprised that in my case "main class not found" error was shown because implementing interface was not on the class path. Sure you can say "you should read everything described in the post" but it seems to me your reason list can be improved.Ordinate
The link is broken: "Hmm. We’re having trouble finding that site. We can’t connect to the server at www.computingnotes.net."Trimble
D
4

You really need to do this from the src folder. There you type the following command line:

[name of the package].[Class Name] [arguments]

Let's say your class is called CommandLine.class, and the code looks like this:

package com.tutorialspoint.java;

    /**
     * Created by mda21185 on 15-6-2016.
     */

    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

Then you should cd to the src folder and the command you need to run would look like this:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

And the output on the command line would be:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
Deluge answered 15/6, 2016 at 11:13 Comment(2)
A class cannot be called "CommandLine.class". That would be a Java syntax error. (What you mean is that the file containing the compiled class is called "CommandLine.class" ... ). The other problem is that your instruction to "cd to the source directory" only works if you compiled the code >>into<< the source directory tree. Finally, if your compile used a "-cp" argument, then you need an equivalent on when you run.Vernverna
In my project I have the src folder and bin folder at the root. I had to cd into src and then run the command java ../bin com.blah.blah.MyClass which worked for me. So thanks for the tip!Eydie
F
3

All right, there are many answers already, but no one mentioned the case where file permissions can be the culprit.

When running, a user may not have access to the JAR file or one of the directories of the path. For example, consider:

Jar file in /dir1/dir2/dir3/myjar.jar

User1 who owns the JAR file may do:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

But it still doesn't work:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

This is because the running user (User2) does not have access to dir1, dir2, or javalibs or dir3. It may drive someone nuts when User1 can see the files, and can access to them, but the error still happens for User2.

Foxed answered 26/9, 2018 at 12:33 Comment(0)
P
2

I got this error after doing mvn eclipse:eclipse. This messed up my .classpath file a little bit.

I had to change the lines in .classpath from

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

to

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />
Proliferate answered 14/12, 2015 at 14:14 Comment(1)
What is 'mvn' supposed to do? Related to Maven?Trimble
H
2

I was unable to solve this problem with the solutions stated here (although the answer stated has, no doubt, cleared my concepts). I faced this problem two times and each time I have tried different solutions (in the Eclipse IDE).

  • Firstly, I have come across with multiple main methods in different classes of my project. So, I had deleted the main method from subsequent classes.
  • Secondly, I tried following solution:
    1. Right click on my main project directory.
    2. Head to source then clean up and stick with the default settings and on Finish. After some background tasks you will be directed to your main project directory.
    3. After that I close my project, reopen it, and boom, I finally solved my problem.
Hydatid answered 4/6, 2016 at 17:4 Comment(1)
Deleting main methods won't fix the problem. There is nothing technically wrong with an application that has multiple entry points.Vernverna
V
2

Sometimes, in some online compilers that you might have tried you will get this error if you don't write public class [Classname] but just class [Classname].

Vlada answered 18/8, 2017 at 18:29 Comment(1)
Examples (of offending compilers) please. While it is conventional / normal to make an "entry point" class public, the Java specs don't require this, and neither does the standard Oracle / OpenJDK java command.Vernverna
S
2

In my case, I got the error because I had mixed UPPER- and lower-case package names on a Windows 7 system. Changing the package names to all lower case resolved the issue. Note also that in this scenario, I got no error compiling the .java file into a .class file; it just wouldn't run from the same (sub-sub-sub-) directory.

Sidneysidoma answered 26/12, 2017 at 19:55 Comment(0)
L
2

I had a weird one:

Error: Could not find or load main class mypackage.App

It turned out I had a reference to POM (parent) coded up in my project's pom.xml file (my project's pom.xml was pointing to a parent pom.xml) and the relativePath was off/wrong.

Below is a partial of my project's pom.xml file:

<parent>
    <groupId>myGroupId</groupId>
    <artifactId>pom-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../badPathHere/pom.xml</relativePath>
</parent>

Once I resolved the POM relativePath, the error went away.

Go figure.

Lowder answered 23/7, 2018 at 19:0 Comment(0)
B
2

Here's another issue that took me a bit of time: The command line class path param doesn't behave as you'd expect. I'm on MacOS calling the CLI directly, and I'm including two jars in the call.

For example, both of these were confusing the tool about the name of the main class:

This one because the asterisk was causing it to parse the args incorrectly:

java -cp path/to/jars/* com.mypackage.Main

And this one because -- I'm not sure why:

java -cp "*.jar" com.mypackage.Main

This worked:

java -cp "path/to/jars/*" com.mypackage.Main

Listing the two jars explicitly also worked:

java -cp path/to/jars/jar1.jar:path/to/jars/jar2.jar com.mypackage.Main

Biome answered 26/11, 2019 at 20:8 Comment(3)
"I'm not sure why" - because * is expanded by the shell to a list of JAR file names separated by spaces ... unless surround by quotes. This is standard UNIX shell stuff. As for the rest: it is all in the java manual entry including the use of : and the wild card syntax ("path/to/jars/*").Vernverna
That was "not sure why "*.jar" doesn't work". The first one was more clearly because the shell was messing with it.Biome
The second one doesn't work because the java command doesn't understand that wild-card. The java manual explains what it does understand.Vernverna
T
2

After searching for 2 days I found this solution and this works. It is pretty weird but it works for me.

package javaapplication3;
public class JavaApplication3 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    System.out.println("Hello");
}

}

this is my program i want to run that locates at C:\Java Projects\JavaApplication3\src\javaapplication3

Now open cmd on this location and compile program using this command

javac JavaApplication3.java

After compiling navigate one directory down i.e. C:\Java Projects\JavaApplication3\src

now run following command to execute program

java javaapplication3.JavaApplication3
Trocar answered 17/9, 2020 at 2:49 Comment(3)
If that works for you, then your source code must have a package javaapplication3; statement that you haven't included in the answer.Vernverna
@StephenC Ohh I am sorry I for include that I will update my answer.Trocar
Now it says essentially the same thing as https://mcmap.net/q/45049/-what-does-quot-could-not-find-or-load-main-class-quot-mean (from 2014)Vernverna
O
2

Scenario: using command prompt(CMD in Windows) for compile and run a simple 'java' program which have only 'Main.java' file, with specified 'package main'.

Source file path :

some-project-name-folder\src\main\Main.java

Destination folder :

some-project-name-folder\dest

Destination file path (folder '\main' and file '\Main.class' will be produced by 'javac') :

some-project-name-folder\dest\main\Main.class

Main.java is as follow :

package main;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

Compilation :

// 'javac' compiler will produce 'Main.class' in the 'dest\main' folder.
// 'main' folder is created because in the source file(in our case: 'Main.java') is
// specified 'package main'.

javac -d ./dest ./src/main/Main.java

Run compiled file (in our case: 'Main.class') :

// '-cp'(is the same as '-classpath')
// './dest'(means destination folder, where resides compiled 'Main.class').
// 'main.Main'(means 'package' 'main', which contains class 'Main'('Main.class'))
// WARNING: when run 'java' class, MUST NOT type extension '.class'
//          after 'class name
//          (in our case: 'main.Main'(<package>.<class-name>) WITHOUT extension 
//           '.class').

java -cp ./dest main.Main

// Hello world
Ori answered 19/9, 2020 at 12:55 Comment(1)
Says same thing as https://mcmap.net/q/45049/-what-does-quot-could-not-find-or-load-main-class-quot-mean (from 2014)Vernverna
H
2

I came one level up. So, now the HelloWorld.class file is in hello\HelloWorld.class and I ran the below command. Where cp is classpath and . means check in current directory only.

java -cp . hello.HelloWorld

Output

Hello world!
Hobby answered 20/9, 2021 at 9:26 Comment(3)
What tutorial? It should output "Hello, World!" (not "Hello world!")Trimble
Also to add to this, the hello.HelloWorld is case sensitive. So if your folder package name is Hello, then the command will be: java -cp . Hello.HelloWorldAntiknock
This answer is incomplete. Apparently, Rishi was trying to run a HelloWorld class that had a package hello; statement. (That's the only way what he did could have worked.)Vernverna
B
2

Among all the answers so far, I lacked someone to call out this gross pitfall with regard to correct specification of application's classpath:

If your application and your dependencies are packaged as jars on the filesystem, and you try to run it using the java [options] <mainclass> variant, then supplying directory name(s) in CLASSPATH is not enough! You have to add the /* wildcard!

Documentation is kind of elusive on this:

If the class path option isn't used and [CLASSPATH] isn't set, then the user class path consists of the current directory (.).

...

This sentence would make you presume that running java com.acme.example.Gerbera with all the needed jars in your current directory would surely work by default. Alas, it doesn't. You need to read a bit further in the documentation. What you need to do is CLASSPATH=./* java com.acme.example.Gerbera, or alternatively enumerate all the .jar filenames literally, with the appropriate separator.

Brand answered 3/6, 2023 at 19:31 Comment(0)
C
1

In the context of IDE development (Eclipse, NetBeans or whatever) you have to configure your project properties to have a main class, so that your IDE knows where the main class is located to be executed when you hit "Play".

  1. Right click your project, then Properties
  2. Go to the Run category and select your Main Class
  3. Hit the Run button.

Enter image description here

Capsulize answered 22/8, 2017 at 4:22 Comment(3)
However, you won't get the above mentioned error messages if you try to run an app without a proper main from an IDE. (And for some IDEs, you don't need to configure a launcher to make this happen; e.g. Eclipse's run will find the class with the main method for you.Vernverna
In fact, if you run the app without this setting, you will get the exact message in the original question: Could not find or load main class ... . That is how I arrived to this post :)Capsulize
Not in Eclipse you won't. In Eclipse, if the IDE can't identify either class with a main, you simply don't get offered the Run>Java App option in the context menu.Vernverna
E
1

If this issue is Eclipse-related:

Try adding the project to your class path.

See the below image:

Enter image description here

This method worked for me.

Ellene answered 19/9, 2018 at 14:52 Comment(0)
F
1

This happened to me too. In my case, it only happened when a HttpServlet class was present in source code (IntelliJ IDEA didn't give a compile time error; the servlet package got imported just fine, however at run time there was this main class error).

I managed to solve it. I went to menu FileProject Structure...:

Enter image description here

Then to Modules:

Enter image description here

There was a Provided scope near the servlet module. I changed it to Compile:

Enter image description here

And it worked!

Filterable answered 10/7, 2019 at 23:12 Comment(0)
W
1

If you use IntelliJ and get the error while running the main method from the IDE, just make sure your class is located in java package, not in kotlinenter image description here

Warlord answered 5/6, 2020 at 20:32 Comment(0)
I
1

[Java Version: 11]

If you are using Java 11 then you don't need to compile and run your java file.

Just run like

Java ClassName.java

Example:

class abc{ 
    public static void main(String[] args){
        System.out.println("hello Jarvis ");    
    }
}

Now Run the command

java abc.java

enter image description here

Ironbark answered 4/11, 2020 at 17:38 Comment(1)
1) Doesn't answer the question. 2) "Alternative syntaxes for java" alternative #3.Vernverna
R
1

In Intellij IDE select run/debug>>edit configuration and then select proper JDK for build and run menu.

Radcliff answered 11/6, 2022 at 13:45 Comment(0)
P
0

By default, Java uses ., the current working directory, as the default CLASSPATH. What this means is that when you type a command at the prompt e.g. java MyClass, the command is interpreted as if you had type java -cp . MyClass. Did you see that dot between -cp and MyClass? (cp is short for the longer classpath option)

This is sufficient for most cases and things seems to work just fine until at some time you try to add a directory to your CLASSPATH. In most cases when programmers need to do this, they just run a command like set CLASSPATH=path\to\some\dir. This command creates a new environment variable called CLASSPATH having the value path\to\some\dir or replaces its value with path\to\some\dir if CLASSPATH was already set before.

When this is done, you now have a CLASSPATH environment variable and Java no longer uses its default classpath (.) but the one you've set. So the next day you open your editor, write some java program, cd to the directory where you saved it, compile it, and try to run it with the command java MyClass, and you are greeted with a nice output: Could not find or load main class ... (If your commands were working well before and you are now getting this output, then this might be the case for you).

What happens is that when you run the command java MyClass, Java searches for the class file named MyClass in the directory or directories that you have set in your CLASSPATH and not your current working directory so it doesn't find your class file there and hence complains.

What you need to do is add . to your class path again which can be done with the command set CLASSPATH=%CLASSPATH%;. (notice the dot after the semicolon). In plain english this command says "Pick what was initially the value of CLASSPATH (%CLASSPATH%), add . to it (;.) and assign the result back to CLASSPATH".

And voila, you are once again able to use your command java MyClass as usual.

Publicist answered 12/5, 2017 at 16:12 Comment(0)
S
0

Solving "Could not Load main class error"

After reading all the answers, I noticed most didn't work for me. So I did some research and here is what I got. Only try this if step 1 doesn't work.

  1. Try to install JRE 32 or 64. If it doesn't work,
  2. Open go to C:\Program Files (x86)\Java or C:\Program Files\Java

    • i. open the jdk folder and then the bin folder.
    • ii. Copy the path and add it to environment variables. Make sure you separate variables with a semi-colon, ;. For example, "C:\Yargato\bin;C:\java\bin;". If you don't, it will cause more errors.

    • iii. Go to the jre folder and open its bin folder.

    • iv. Here search for rt.jar file. Mine is:

      C:\Program Files (x86)\Java\jre1.8.0_73\lib\rt.jar Copy and under environment variable and search for the classpath variable and paste it there.

    • v. Now restart cmd and try running again. The error will disappear.
    • vi. I will post a link to my YouTube video tutorial.
Suppletion answered 4/1, 2018 at 22:1 Comment(11)
This is voodoo stuff. %JAVA_HOME\bin% does need to be on the %PATH%, but that causes a different error. %JAVA_HOME\lib\rt.jar% does not need to be added to the classpath. It is automatically added to the bootclasspath by all JRE or JDK tools that need it.Vernverna
The error appears when it is not added. That is why step 1 is very important.Suppletion
Just try it, because it just worked for my friends in class right nowSuppletion
I know that you need to install Java (duh!) and put it on your %PATH%. But if you don't, you will get a different error message. For example "java is not recognized as an internal or external command". I repeat, the "solutions" that you suggest do not solve >> this << problem.Vernverna
you need to end the last environment variable with a semi colon. before adding the new path. I.e "C:\Yargato\bin;C:\java\bin;C:\Programfiles\java......; also end it with a semicolonSuppletion
You owe us a YouTube link... You can just add the 11 characters after "watch?v=" in the URL (e.g yVRtJbXQsL8 for https://www.youtube.com/watch?v=yVRtJbXQsL8) and somebody can add the real URL later.Trimble
@dassanctity - Your assertion that the classpath must end with a semicolon is incorrect according to the Oracle documentation: docs.oracle.com/javase/8/docs/technotes/tools/windows/…Vernverna
According to windows, semicolon separates one environment path from another. So it must not end with a semicolon but be sure to put a semicolon before adding a new one else you will cause more errors. This is not according to oracle but windows definitionsSuppletion
@dassanctity - Your comment of May 25 contradicts your previous comments. "you need to end the last environment variable with a semi colon." versus "So it must not end with a semicolon". (IMO, the best thing would be to delete this Answer. It has too many mistakes, and adds nothing that other answers don't say already.)Vernverna
@StephenC let me use an example. Lets say i wish to add this new env. path "C:\Program Files\Cisco Packet Tracer 7.0\bin" then when i go to my env. paths and i see other paths, I need to make sure the other path ends with a semi colon before adding the new path. This is for windows 8.1 or earlier.Suppletion
That is NOT what the example in your Answer shows. That shows a semicolon at the end. And your various comments say that a semicolon at the end is required or not required. And this is just one of many problems with this Answer.Vernverna
F
0

I got this issue for my demo program created in IntelliJ.

There are two key points to solve it:

  1. the package name of program
  2. the current working dir of the terminal/cmd prompt

my demo program:

package io.rlx.tij.c2;

public class Ex10 {
    public static void main(String[] args) {
        // do something
    }
}

the path of source code:

../projectRoot/src/main/java/io/rlx/tij/c2/Ex10.java
  1. go to java dir: cd ../projectRoot/src/main/java
  2. compile to class: javac ./io/rlx/tij/c2/Ex10.java
  3. run program: java io.rlx.tij.c2.Ex10

if I run program in ../projectRoot/src/main/java/io/rlx/tij/c2 or I run it without package name, I will get this error: Error: Could not find or load main class.

Fini answered 10/5, 2020 at 11:48 Comment(1)
Says same thing as https://mcmap.net/q/45049/-what-does-quot-could-not-find-or-load-main-class-quot-mean (from 2014)Vernverna
T
0
  • In IntelliJ IDEA, check your global libraries* and local libraries
  • Check in the libraries version file pom.xml, Maybe it is an old library
  • They are so many possibilities mentioned in the previous answers that need to be tried too
Tetrameter answered 28/12, 2020 at 17:12 Comment(0)
B
0

In my case, my class was referring a file which was opened outside Eclipse. So it could not regenerate class on recompiling. Need to make sure all issues in "Problems" tab are cleared out.

Beefwood answered 17/7, 2023 at 19:0 Comment(0)
R
0

For Java 17, I had to ensure one of the classes in a module atleast had a main method. Simply adding the main method fixed it for me

Rabblement answered 20/9, 2023 at 12:7 Comment(0)
P
-1

Seems like when I had this problem, it was unique.

Once I removed the package declaration at the top of the file, it worked perfectly.

Aside from doing that, there didn't seem to be any way to run a simple HelloWorld.java on my machine, regardless of the folder the compilation happened in, the CLASSPATH or PATH, parameters or folder called from.

Palermo answered 23/2, 2017 at 6:59 Comment(2)
There are lots of ways to make it work. It all boils down to >>understanding<< how to use the Java classpath mechanism. Please read my answer, and the resources that it links to.Vernverna
And if you take this "solution" to its logical conclusion then you end up declaring all of your classes in the default package, which is a seriously bad idea for programs of a significant size.Vernverna
I
-1

Right click the project.

  1. Select "Open module settings"
  2. Mark the src folder as "sources"
  3. Go to edit configurations, and then select your main class
  4. Click OK or the Apply button

This worked for me.

Interment answered 4/1, 2019 at 12:27 Comment(0)
F
-1

One more scenario that got me scratch my head, and I found no reference to it herein, is:

package com.me
Public class Awesome extends AwesomeLibObject {
    ....
    public static void main(String[] argv) {
         System.out.println("YESS0");
    }
}

Where AwesomeLibObject is a class defined in an external lib. I got the same confusing error message for it:

Error: Could not find or load main class com.Awesome

The resolution is simple: the external lib must be in classpath as well!

Fanciful answered 14/7, 2020 at 12:30 Comment(1)
Reason #2c - incorrect classpath / missing dependencyVernverna
T
-1

Reason #2 - the application's classpath is incorrectly specified. Read the three documents linked previously. (Yes ... read them! It is important that a Java programmer understands at least the basics of how the Java classpath mechanisms works.) I want to add this documentation to this very good post from above.

JDK Tools and Utilities General General Information (file structure, classpath, how classes are found, changes) Enhancements (enhancements in JDK 7) Standard JDK Tools and Utilities

https://docs.oracle.com/javase/7/docs/technotes/tools/index.html

https://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html

https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

How the Java Launcher Finds Classes Understanding the class path and package names

https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html

ClassLoader in Java The Java ClassLoader is a part of the Java Runtime Environment that dynamically loads Java classes into the Java Virtual Machine. The Java run time system does not need to know about files and file systems because of classloaders.

Java classes aren’t loaded into memory all at once, but when required by an application. At this point, the Java ClassLoader is called by the JRE and these ClassLoaders load classes into memory dynamically.

https://en.wikipedia.org/wiki/Java_Classloader

https://www.geeksforgeeks.org/classloader-in-java/

https://en.wikipedia.org/wiki/Java_virtual_machine

Enter image description here

Enter image description here

Enter image description here

Tetrameter answered 28/12, 2020 at 9:52 Comment(1)
Thanks, but no thanks. The behavior of classloader hierarchies is unlikely to be the cause of the reader's problems. If you look at reason #2, you will notice that it is written to encourage to reader to go elsewhere for an explanation of the classpath and related things. I made a deliberate and considered decision to do that. (Ideally there should be another canonical Q&A that describes that stuff. Also, notice that people are already complaining that my answer to this question is already too long.Vernverna
S
-1

The simplest way you can fix it is by redownloading the Maven Apache here: https://maven.apache.org/download.cgi

Than you set your path again:

Enter image description here

System variable

Put the path there where you set your Apache Maven folder like: C:\Program Files\apache-maven-3.8.4\bin

Enter image description here

Restart the terminal or IDE, and it should work.

It always works for me.

Shuffle answered 13/12, 2021 at 20:23 Comment(2)
If your are not running a maven project try check out your java PATH, sometimes if the java path are not set your program won't run, 'cause cant find the main class.Shuffle
The Question is not about how to get Maven to run.Vernverna
L
-1

It basically means that there isn't a static main(String[] args) method. It should resolve it automatically. If it doesn't, something was screwed when the program was either made (it doesn't have a main method) or when the program was packaged (incorrect manifest information.)

This works

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

This doesn't work

public class Hello {
    public Hello() {
        System.out.println("Hello");
    }
}
Liatris answered 24/1, 2022 at 1:12 Comment(2)
This answer is misleading. The exception + message can be caused by many different things. It is NOT "basically" caused by one thing.Vernverna
And ... in fact ... if your "main" class (Hello in your example) doesn't contain a suitable main method, you will actually get a different exception + message. So your answer is not even apropos the question.Vernverna
A
-1

For a new version of Java which is Java18 up to until 2022. You have to only write the package keyword and the folder name in which you have the java extension file and semicolon, like below:

package JavaProgramming;

because I have the hello.java file in the JavaProgramming file. Note: Never give the space while writing folder names for java. Like Java Programming you have to keep it like; JavaProgramming, etc;

The whole code structure of a simple hello world is given below:

package JavaProgramming;

public class hello {
  public static void main(String[] args) {
     System.out.println("Hello java after long time");
      }
    }
Aletaaletha answered 11/6, 2022 at 18:44 Comment(0)
S
-2

For a database connection I was getting this one. I just added the following in the class path:

export CLASSPATH=<path>/db2jcc4.jar:**./**

Here I appended ./ in last so that my class also get identified while loading.

Now just run:

java ConnectionExample <args>

It worked perfectly fine.

Snowflake answered 7/2, 2017 at 13:25 Comment(1)
That will fail if you are not in the directory where you compiled the classes.Vernverna
C
-2

Answering with respect to an external library -

Compile:

javac -cp ./<external lib jar>: <program-name>.java

Execute:

java -cp ./<external lib jar>: <program-name>

The above scheme works well in OS X and Linux systems. Notice the : in the classpath.

Constringe answered 16/9, 2018 at 5:12 Comment(0)
H
-2

If it's a Maven project:

  1. Go to the POM file.
  2. Remove all the dependencies.
  3. Save the POM file.
  4. Again import only the necessary dependencies.
  5. Save the POM file.

The issue should go away.

Hyperactive answered 23/6, 2019 at 6:40 Comment(1)
It is highly unlikely that this will cause the problem to go away ... for most people.Vernverna
B
-2

This is how I solved my issue.

I noticed if you are including jar files with your compilation, adding the current directory (./) to the classpath helps.

javac -cp "abc.jar;efg.jar" MyClass.java
java -cp "abc.jar;efg.jar" MyClass

vs.

javac -cp "**./**;abc.jar;efg.jar" MyClass.java<br>
java -cp "**./**;abc.jar;efg.jar" MyClass
Bluey answered 12/1, 2021 at 20:58 Comment(3)
This should make zero difference. Both forms are valid Java, and they are equivalent.Vernverna
I will edit, the classpath "./", made the biggest difference.Bluey
Well, yea. An incorrect classpath is reason #2 of the accepted answer. And note that your particular fix only works in some circumstances. (It won't work on MacOS or Linux for instance.)Vernverna
W
-2

If your package name is javatpoint and the package name is com.javatpoint and the class name is AnotherOne, then compile your class like this type:

cd C:\Users\JAY GURUDEV\eclipse-workspace\javatpoint\src\com\javatpoint
javac AnotherOne.java

And run this class using

cd C:\Users\JAY GURUDEV\eclipse-workspace\javatpoint\src
java com.javatpoint.AnotherOne

(Here the package name should be excluded.)

Wickham answered 1/2, 2022 at 8:10 Comment(1)
I edited your post's format (the executable blocks) so please mind the formatting on your next posts. In addition, what is the added value compared to that answer? (same post) #18094428Boss
A
-3

In my case I just change the JRE in Eclipse.

Please find the attached screen shot:

Enter image description here

Actable answered 17/6, 2018 at 12:22 Comment(0)
S
-3

Excluding the following files solved the problem.

META-INF/*.SF

META-INF/*.DSA

META-INF/*.RSA

Added the following code in build.gradle

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
    {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    manifest {
        attributes(
                'Main-Class': 'mainclass'
        )
    }
}
Sigmoid answered 3/2, 2021 at 17:31 Comment(1)
Why did it solve the problem? What are you actually doing here? This looks like a hack that you might do if you were modifying a signed JAR file. Please explain what you are actually doing ... so that people can decide whether your "this works for me" solution is relevant to what they are doing.Vernverna

© 2022 - 2025 — McMap. All rights reserved.