Gradle Java Application on Windows

Error: command line to long

Image by mohamed Hassan from Pixabay

If you create a Java application with the Gradle Application Plugin, you will sooner or later encounter the problem that the application can not be started under Windows.

The error message: command line too long

This limitation is documented in Windows Help.

But why does the error occur at all? (Needless to say, Microsoft just can not get it to develop a working OS?)


The problem can be found in Gradle’s Starter Script. It builds a CLASSPATH environment variable that contains the paths to all dependent JARs.

It will look like that:

set CLASSPATH=%APP_HOME%\lib\my-application-1.2.3.jar;%APP_HOME%\lib\jackson-module-kotlin-2.9.9.jar;%APP_HOME%\lib\kotlin-reflect-1.3.40.jar;%APP_HOME%\lib\kotlin-stdlib-jdk8-1.3.40.jar;%APP_HOME%\lib\slf4j-simple-1.7.25.jar;%APP_HOME%\.....

It’s clear that this variable gets bigger as the application gets more dependencies. The variable is then simply appended to the Java command as a -classpath parameter.

"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% -classpath "%CLASSPATH%" my.Application %CMD_LINE_ARGS%

Voila, you get a command line that will sooner or later exceed the limit.

But the problem is easy to work around. To do this you make use of the class-path property of the JAR Manifesto. Instead of directly appending the dependency list to the Java command, the list is simply appended to the JAR manifest of the application.

jar {
manifest {
attributes(
"Class-Path": (configurations.runtime.files)*.name.join(" ")
)
}
}
startScripts {
classpath = jar.outputs.files
}

From now on, the Starter Script will only have a classpath entry on the Application JAR.

set CLASSPATH=%APP_HOME%\lib\my-application-1.2.3.jar

All dependencies are now in MANIFEST.MF of my-application.jar

Manifest-Version: 1.0
Class-Path: jackson-module-kotlin-2.9.9.jar kotlin-reflect-1.3.40.jar kotlin-stdlib-jdk8-1.3.40.jar slf4j-simple-1.7.25.jar ...

Disclaimer: The solution was originally posted in the old Gradle Forum. However, I have adjusted it and completely abandon the “launcher” JAR.

Tristan “tril” Lins

Written by

A mixture of developer, software architect and administrator — or in modern words: a devop

More From Medium

Also tagged Gradle

Top on Medium

Top on Medium

Will Oremus
Feb 25 · 22 min read

1.3K

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade