13

Java can run jar files from the command line like this:

java -jar foobar.jar

However, if foobar.jar depends on baz.jar, the above will throw an exception as soon as any of the classes in baz.jar is invoked, as the JVM has no way to know where to look for these.

However, the man page (OpenJDK 8 on Linux) states that:

When you use the -jar option, the specified JAR file is the source of all user classes, and other class path settings are ignored.

If repackaging is not an option, is there a way to run a jar file with dependencies from the command line?

2 Answers 2

21

When you use java -jar, dependencies are not specified on the command line. You have 2 ways to add jars to the class path:

  1. Call java with the main class and add jar files, including your foobar.jar, on the command line:

    java -cp foobar.jar:baz.jar com.mycompany.MainClass
    
  2. Include dependencies in foobar.jar's manifest file (and then run java -jar)

    Class-Path: baz.jar
    
5
  • Does the colon need to be a semicolon on windows? Commented Mar 3, 2022 at 14:08
  • 1
    Yes, it does, @ThomasStokes
    – ernest_k
    Commented Mar 3, 2022 at 14:09
  • I try this but I get an error : "Could not find or load main class" How can java find the main class name in the right package ?
    – Nab
    Commented Feb 1 at 18:33
  • @Nab Are you typing the fully qualified class name (with packages)? The only other reason would be that the class is not in the jar.
    – ernest_k
    Commented Feb 5 at 7:03
  • My bad, as I am running this on windows, the correct command is : java -cp "MyJar.jar;lib*" com.somepackage.subpackage.Main
    – Nab
    Commented Feb 5 at 10:02
1

I believe you have only 'one' main class in foobar.jar. If it is more then 1, then you need to specify which one to execute.
You can simply set the classpath, before executing the jar

export CLASSPATH=$CLASSPATH:/JAR_LOCATION/bar.jar


1
  • Yes, I have only one main class in foobar.jar, else the application wouldn’t even start. Adding baz.jar (I suppose that’s the one you mean) to $CLASSPATH didn’t help either (I suppose they mean it when they write in the docs that all other classpath settings are ignored).
    – user149408
    Commented Oct 27, 2018 at 19:22

Not the answer you're looking for? Browse other questions tagged or ask your own question.