Empty classpath returned on Java 9
Description
Environment
JDK 9
Attachments
- 10 Mar 2018, 05:59 PM
Activity
Stuart Sierra May 6, 2018 at 6:59 PM
Patch included in 0.3.0 release
Bozhidar Batsov April 25, 2018 at 12:46 PM
In light of the lack of other options I guess the patch should be applied. I constantly see bug reports from people running into this on Java 9+.
Stuart Sierra March 10, 2018 at 6:02 PM
For reference:
Java 8 classloader hierarchy as seen by Clojure 1.9.0:
(clojure.lang.RT/baseLoader)
class: clojure.lang.DynamicClassLoader
extends java.net.URLClassLoader, java.lang.ClassLoader, java.security.SecureClassLoader
parent:
class: clojure.lang.DynamicClassLoader
extends java.net.URLClassLoader, java.lang.ClassLoader, java.security.SecureClassLoader
parent:
class: sun.misc.Launcher$AppClassLoader
extends java.net.URLClassLoader, java.lang.ClassLoader, java.security.SecureClassLoader
has parent:
class: sun.misc.Launcher$ExtClassLoader
extends java.net.URLClassLoader, java.lang.ClassLoader, java.security.SecureClassLoader
Java 9 classloader hierarchy as seen by Clojure 1.9.0:
(clojure.lang.RT/baseLoader)
class: clojure.lang.DynamicClassLoader
extends java.security.SecureClassLoader, java.net.URLClassLoader, java.lang.ClassLoader
parent:
class: clojure.lang.DynamicClassLoader
extends java.security.SecureClassLoader, java.net.URLClassLoader, java.lang.ClassLoader
parent:
class: jdk.internal.loader.ClassLoaders$AppClassLoader
extends jdk.internal.loader.BuiltinClassLoader, java.security.SecureClassLoader, java.lang.ClassLoader
parent:
class: jdk.internal.loader.ClassLoaders$PlatformClassLoader
extends jdk.internal.loader.BuiltinClassLoader, java.security.SecureClassLoader, java.lang.ClassLoader
Stuart Sierra March 10, 2018 at 5:59 PM
Attached file CLASSPATH-8-patch01.patch implements the easy fix: When the URLClassLoader search fails, fall back to the java.class.path
system property.
This should still work in application containers that use URLClassLoader, but I do not have a test case for that readily available.
I am not sure what the implication will be for other tools that manipulate classloaders or classpaths.
Stuart Sierra March 10, 2018 at 5:31 PM
The reason clojure.java.classpath/classpath
uses the classloader chain has to do with application containers that create their own classloaders, see https://clojure.atlassian.net/browse/CLASSPATH-1#icft=CLASSPATH-1 and CLASSPATH-2.
Details
Details
Assignee
Reporter
Patch
Priority

When running on JDK 9,
(classpath)
returns an empty list.