Empty classpath returned on Java 9

Description

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

Environment

JDK 9

Attachments

1
  • 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.

Completed

Details

Assignee

Reporter

Patch

Priority

Created December 1, 2017 at 7:48 PM
Updated May 6, 2018 at 6:59 PM
Resolved May 6, 2018 at 6:59 PM