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?
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?
java <class-name>
command syntaxFirst 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:
com.acme.example.ListUsers
class.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.)String[]
.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?
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
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:
java
command documentationSo ... if you have specified the class name correctly, the next thing to check is that you have specified the classpath correctly:
java
command. Check that the directory names and JAR file names are correct.java
command.;
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.)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.
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:
com.acme.example.Foon
class,/usr/local/acme/classes/com/acme/example/Foon.class
,/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:
-classpath
option can be shortened to -cp
in most Java releases. Check the respective manual entries for java
, javac
and so on.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.)
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.
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).
java
There are three alternative syntaxes for the launching Java programs using the java command
.
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.
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>
.
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.
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.
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 work –
Geny 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 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.properties
declared 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 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 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
javac TestCode.java
followed by java TestCode
–
Pentateuch java -classpath . HelloWorld
–
Feliciafeliciano java <Filename>
@ChrisPrince –
Honeysweet 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.
java com.firstpackage.Test
inside Helloworld directory doesn't work and neither does the command java -classpath C:\Users\matuagkeetarp\IdeaProjects\Helloworld\src\com\firstpackage Test.java
set classpath variable. Can you help? –
Ozone 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
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
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
javac -classpath . HelloWorld.java
would have worked! And that is a better solution in your case. –
Vernverna java <Filename>
shows error and java -cp . <Filename>
does not. How to make java <Filename>
runtime successfull? @StephenC –
Honeysweet 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 Specifying the classpath on the command line helped me. For example:
Create a new folder, C:\temp
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]);
}
}
Open a command line in folder C:\temp
, and write the following command to compile the Temp class:
javac Temp.java
Run the compiled Java class, adding the -classpath
option to let JRE know where to find the class:
java -classpath C:\temp Temp Hello!
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 classpath
like this java -classpath c:\folder\subfoler\myCodeFolder Main
worked for me as well to run Main.class
. –
Loyceloyd According to the error message ("Could not find or load main class"), there are two categories of problems:
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.
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 -Xdiag
flag may give you a hint. –
Synge 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.
-cp .
is unnecessary, because if $CLASSPATH
is unset, then .
is the default classpath. –
Vernverna echo %CLASSPATH%
output?) And no, I can't check because I don't have a Windows PC. –
Vernverna -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.html –
Vernverna 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.
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
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 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.
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
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.
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>
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.
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.
/*
is necessary? –
Oglesby 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.
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. :)
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.
utilities.myapp.Cool
or whatever its package name is, if any. –
Eleanoraeleanore 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.
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.
What fixed the problem in my case was:
Right click on the project/class you want to run, and then Run As → Run 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.
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
Run:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
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_programming –
Vernverna 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)".
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 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/
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
cd
into src
and then run the command java ../bin com.blah.blah.MyClass
which worked for me. So thanks for the tip! –
Eydie 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.
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" />
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).
main
methods in different classes of my project. So, I had deleted the main
method from subsequent classes.main
methods won't fix the problem. There is nothing technically wrong with an application that has multiple entry points. –
Vernverna 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]
.
public
, the Java specs don't require this, and neither does the standard Oracle / OpenJDK java
command. –
Vernverna 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.
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.
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
*
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 java
command doesn't understand that wild-card. The java
manual explains what it does understand. –
Vernverna 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
package javaapplication3;
statement that you haven't included in the answer. –
Vernverna 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
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!
HelloWorld
class that had a package hello;
statement. (That's the only way what he did could have worked.) –
Vernverna 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.
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".
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 Could not find or load main class ...
. That is how I arrived to this post :) –
Capsulize main
, you simply don't get offered the Run>Java App option in the context menu. –
Vernverna If this issue is Eclipse-related:
Try adding the project to your class path.
See the below image:
This method worked for me.
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 File → Project Structure...:
Then to Modules:
There was a Provided scope near the servlet module. I changed it to Compile:
And it worked!
[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
In Intellij IDE
select run/debug>>edit configuration
and then select proper JDK
for build and run menu.
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.
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.
Open go to C:\Program Files (x86)\Java or C:\Program Files\Java
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.
%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 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 "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 I got this issue for my demo program created in IntelliJ.
There are two key points to solve it:
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
java
dir: cd ../projectRoot/src/main/java
javac ./io/rlx/tij/c2/Ex10.java
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
.
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.
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
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.
Right click the project.
src
folder as "sources"This worked for me.
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!
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/
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:
Put the path there where you set your Apache Maven folder like: C:\Program Files\apache-maven-3.8.4\bin
Restart the terminal or IDE, and it should work.
It always works for me.
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");
}
}
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 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");
}
}
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.
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.
If it's a Maven project:
The issue should go away.
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
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.)
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'
)
}
}
© 2022 - 2025 — McMap. All rights reserved.