- Follow this answer, if you've got a
jar
file, and you need to run it
- See troubleshooting sections for hints to solve most common errors
Introduction
There are several ways to run java application:
java -jar myjar.jar
- is the default option to run application
java -cp my-class-path my-main-class
or java -classpath my-class-path my-main-class
java --module-path my-module-path --module my-module/my-main-class
- Deployment to an enterprise server. It's when you have
war
or ear
file. We'll omit the explanation for this
case
In this answer I'll explain, how to run a jar
if you have to run it manually, give hints to resolve common problems.
java -jar
Start with the most common option: run the jar
file using the -jar
. Example:
java -jar myjar.jar
If it fails:
- with
no main manifest attribute
, then the jar
is not executable:
- with other error, then see "Troubleshooting" section below
Classpath or module path
If -jar
failed, then the jar should be run using classpath or module-path.
Module-path is used, when an application is modular itself.
JPMS - Java Platform Module System - is a modern way to develop, distribute and run applications. For details:
- Watch excellent Modular Development with JDK 9 by Alex Buckley
- See awesome-java-module-system
To run a jar:
- Determine if it's modular or not:
- Invoke:
jar --describe-module --file=path-to-jar-file
- Examine output:
- If you see
No module descriptor found.
in the first line, then proceed with classpath solution below
- If you see something similar to:
org.diligentsnail.consoleconsumer@1.0-SNAPSHOT jar:file:///home/caco3/IdeaProjects/maven-multi-module-project-demo/jars/console-consumer.jar!/module-info.class
requires java.base mandated
requires org.diligensnail.hellolibrary
continue with module-path
solution below
See also: List modules in jar file
Classpath
Try the following:
java -cp my-jar.jar my-main-class
-cp
is the same as -classpath
my-jar.jar
is the jar to run
my-main-class
is name of the class with static void main(String[])
method
Example:
java -cp jars/console-consumer.jar org.diligentsnail.consoleconsumer.Main
Module-path
Try the following command:
java --module-path my-jar.jar --module my-module-name/my-main-class
my-jar.jar
is the jar
to run
my-module-name
is name of the module where my-main-class
belongs
- Usually
my-module-name
is in the module-info.java
file
my-main-class
- the class with the static void main(String[])
method
If it fails with FindException
:
Troubleshooting
UnsupportedClassVersionError
Update java. See List of Java class file format major version numbers?
NoClassDefFoundError
, NoSuchMethodError
, NoSuchFieldError
See:
- "Supplying dependencies" section
- Why am I getting a NoClassDefFoundError in Java?
Supplying dependencies
An Error
or Exception
is thrown when an application run with missing or out of date dependencies.
Common exceptions and errors:
NoClassDefFoundError
, NoSuchFieldError
, NoSuchMethodError
ClassNotFoundException
, NoSuchFieldException
, NoSuchMethodException
FindException
To supply dependencies:
- Determine the list of dependencies
- Usually it's a list of
jar
or can be a list of directories or both
- Join the list with
:
if you're running Unix, ;
- if you're on Windows
- Invoke java with
-classpath
or --module-path
Example
- Project maven-multimodule-project-demo
- I'm trying to run
console-consumer.jar
:
- Error I get:
Exception in thread "main" java.lang.NoClassDefFoundError: org/diligentsnail/hellolibrary/Hello
at org.diligentsnail.consoleconsumer.Main.main(Main.java:11)
Caused by: java.lang.ClassNotFoundException: org.diligentsnail.hellolibrary.Hello
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 1 more
- Missing dependency is
jars/hello-library.jar
- Correct command:
java -classpath jars/console-consumer.jar:jars/hello-library.jar org.diligentsnail.consoleconsumer.Main