Clojure can't be loaded from the boot classpath under java 9

Description

As part of the changes for the jigsaw module system in Java 9, the
java packages available to the boot classloader are now a subset of
the the full java distribution. This means that classes loaded via the
boot classloader cannot access any classes outside of that subset.

In the boot classloader only the java.base module is available. For a complete list of module/package listings see http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html

Clojure itself uses java.sql.Timestamp in clojure.instant to provide print-method and print-dup implementations for java.sql.Timestamp.

This can be seen with (using Clojure 1.4.0 or higher, and a early-access build
of Java 9, most recently tested with 9-ea+147):

This affects any clojure-based tool that puts itself on the boot
classpath in order to gain a startup time boost (both lein
and boot are affected currently).

Proposed: If java.sql.Timestamp is not available, do not load instant.clj or install it in the default data readers.

Patch: clj-2077-4.patch

Screener Notes: This looks correct and does not break normal usage. Should be tested in the bootclasspath scenarios people have problems with.

Environment

None

Attachments

4

Activity

Show:

Alex Miller September 18, 2017 at 7:33 PM

Released in 1.9.0-beta1.

Alex Miller September 11, 2017 at 7:29 PM

Hey Andrew, this is possible, and I went down this road a bit, but in the end I did not find the complexity of splitting it to be worth the effort. While you can work around the constructor-side of the reader parts as Timestamp is not used by default there, the Timestamp use is squarely in the middle of print support. A tagged literal that you can read but not print is of limited use so it seemed best to just omit the entire tag.

andrewhr September 9, 2017 at 12:45 AM

Please correct me if I'm wrong, but as far as I can understand the issue is only related to code}}java.sql.Timestamp{{/code. The path removes the whole "instant.clj" file, but only a small portion of it is related to the problematic class.

Wouldn't be better to split it apart and conditionally load only the code}}java.sql.Timestamp{{/code portion of the code, like is already done with 1.8's code}}java.time.Instant{{/code on "code_instant18.clj"?

Alex Miller September 8, 2017 at 6:51 PM

whoops, swapped the data readers in -3. fixed in -4.

Alex Miller September 8, 2017 at 4:19 PM

Added -3 patch that applies cleanly to latest master.

Completed

Details

Assignee

Reporter

Labels

Approval

Ok

Patch

Code

Priority

Affects versions

Fix versions

Created December 6, 2016 at 6:33 PM
Updated September 18, 2017 at 7:33 PM
Resolved September 18, 2017 at 7:33 PM