Jar within a jar throws a runtime error


  • Type: Defect Defect
  • Status: Open Open
  • Priority: Major Major
  • Resolution: Unresolved
  • Affects Version/s: Release 1.2, Release 1.3
  • Fix Version/s: Release 1.7
  • Component/s: None
  • Labels:
  • Environment:
    Maven using the one-jar plugin
  • Patch:
  • Approval:


I've created two jar files in my multi-project Maven setup. The first jar is the "engine", and it includes the clojure jar in it. The other jar is the "application". It includes the engine and then packages itself into a one-jar jar file. This means we have a jar within a jar: The "onejar" contains the engine jar, which in turn contains that clojure jar.

I then get an error in the runtime:

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
at java.lang.reflect.Method.invoke(
at com.simontuffs.onejar.Boot.main(
Caused by: java.lang.ExceptionInInitializerError
at com.ziroby.clojure.App.main(
... 6 more
Caused by: java.lang.NullPointerException
at clojure.lang.RT.lastModified(
at clojure.lang.RT.load(
at clojure.lang.RT.load(
at clojure.lang.RT.doInit(
at clojure.lang.RT.<clinit>(
... 7 more

See also my Stack Overflow question on this at

In researching it, I've found the problem lies in RT.lastModified, where it tries to determine last modified time by looking at the modified time on the jar file for Clojure. But there's not actually a jar file, since it's embedded in another.

I've found that adding a null check solves the problem. My lastModified looks like this now:

static public long lastModified(URL url, String libfile) throws Exception{
if(url.getProtocol().equals("jar")) { ZipEntry entry = ((JarURLConnection) url.openConnection()).getJarFile().getEntry(libfile); if (entry != null) return entry.getTime(); }

return url.openConnection().getLastModified();

This runs successfully.

If you'd prefer, I can submit a patch, or commit directly.

  1. clj-971-1.patch
    24/Nov/13 7:11 AM
    1 kB
    Paavo Parkkinen
  2. clj-971-2.patch
    25/Nov/13 6:19 AM
    2 kB
    Paavo Parkkinen


Alex Miller made changes -
Field Original Value New Value
Labels bug
Alex Miller made changes -
Approval Triaged [ 10120 ]
Paavo Parkkinen made changes -
Patch Code [ 10001 ]
Attachment clj-971-1.patch [ 12486 ]
Paavo Parkkinen made changes -
Attachment clj-971-2.patch [ 12489 ]
Stuart Halloway made changes -
Approval Triaged [ 10120 ] Incomplete [ 10006 ]
Alex Miller made changes -
Approval Incomplete [ 10006 ]
Alex Miller made changes -
Approval Triaged [ 10120 ]
Rich Hickey made changes -
Fix Version/s Release 1.7 [ 10250 ]
Approval Triaged [ 10120 ] Vetted [ 10003 ]


Vote (1)
Watch (2)


  • Created: