Java classpath and directories

The wildcard for jars has arrived.

| |

The java classpath has always been quite a sad story. Countless of shell script were written to start java applications.

Of course we were always able to pass a directory of classes to the jvm like this:

java -classpath dirwithclasses Main

But what you usually deal with are jars. Often quite a bunch of them. If you add them the same way

java -classpath dirwithclasses:dirwithjars Main

until java 5 all you got was a ClassNotFoundException. Java just did not search for jars, but only classes in the directories. It completely ignored the jars. So what pretty much everyone ended up doing is providing yet another shell script to build up the classpath and pass it to the jvm via command line. Another kind of classpath hell.

java -classpath lib/commons-logging-1.1.1.jar:lib/commons-jci-core-1.0.jar:commons-io-1.2.jar:lib/junit-3.8.2.jar:lib/maven-project-2.0.8.jar:lib/rhino-js-1.6.5.jar: ...

Since Java 6 you can use wildcards in the classpath.

java -classpath classes:lib/'*' Main

Naturally this means the order of the jars is implicit. Which in turn means you need to be extra careful how you name your jars. But it’s a nice feature that should have been there from day one.