Skip to content

Unable to load cider-nrepl under JDK 11 without explicit -add-module jdk.javadoc #651

@brunchboy

Description

@brunchboy

Expected behavior

Setting up an embedded nREPL server using:

(nrepl-server/start-server :port port :handler (nrepl-handler))

should work (with nrepl-handler defined as in the docs).

Actual behavior

Upon connecting to the nREPL server from CIDER, the stack trace below is seen, and is repeated after every interaction. To avoid this, the application (which is shipped as an executable Jar) must be launched from the command line with an -add-modules option as follows:

java --add-modules jdk.javadoc -jar my-app.jar

This is not necessary when running under JDK 10 or earlier. Since many of my users are non-programmers who are not familiar with the command line (and certainly not Java options), I would very much like to be able to continue allowing them to launch the program by double-clicking the Jar file, but I can’t see any way to do that under JDK 11 or later with cider-nrepl as it stands. Is there any hope of removing this module dependency, or having the handler gracefully offer reduced functionality when it is unavailable?

Here is the stacktrace:

ERROR: Unhandled REPL handler exception processing message {:nrepl.middleware.print/stream? 1, :nrepl.middleware.print/print cider.nrepl.pprint/pprint, :nrepl.middleware.print/quota 1048576, :nrepl.middleware.print/options {:right-margin 70}, :op init-debugger, :session c5bdcb5a-33bc-4ab5-994c-78fdb660d505, :id 6}
Syntax error compiling at (cider/nrepl/inlined_deps/orchard/v0v5v1/orchard/java/parser.clj:1:1).
	at clojure.lang.Compiler.load(Compiler.java:7648)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:459)
	at clojure.lang.RT.load(RT.java:424)
	at clojure.core$load$fn__6839.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3702)
	at clojure.lang.Compiler$BodyExpr.eval(Compiler.java:6134)
	at clojure.lang.Compiler$IfExpr.eval(Compiler.java:2729)
	at clojure.lang.Compiler$DefExpr.eval(Compiler.java:457)
	at clojure.lang.Compiler.eval(Compiler.java:7182)
	at clojure.lang.Compiler.load(Compiler.java:7636)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:459)
	at clojure.lang.RT.load(RT.java:424)
	at clojure.core$load$fn__6839.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:703)
	at cider.nrepl.inlined_deps.orchard.v0v5v1.orchard.info$eval1469$loading__6721__auto____1470.invoke(info.clj:1)
	at cider.nrepl.inlined_deps.orchard.v0v5v1.orchard.info$eval1469.invokeStatic(info.clj:1)
	at cider.nrepl.inlined_deps.orchard.v0v5v1.orchard.info$eval1469.invoke(info.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7177)
	at clojure.lang.Compiler.eval(Compiler.java:7166)
	at clojure.lang.Compiler.load(Compiler.java:7636)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:459)
	at clojure.lang.RT.load(RT.java:424)
	at clojure.core$load$fn__6839.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:1096)
	at cider.nrepl.middleware.stacktrace$eval1390$loading__6721__auto____1391.invoke(stacktrace.clj:1)
	at cider.nrepl.middleware.stacktrace$eval1390.invokeStatic(stacktrace.clj:1)
	at cider.nrepl.middleware.stacktrace$eval1390.invoke(stacktrace.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7177)
	at clojure.lang.Compiler.eval(Compiler.java:7166)
	at clojure.lang.Compiler.load(Compiler.java:7636)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:459)
	at clojure.lang.RT.load(RT.java:424)
	at clojure.core$load$fn__6839.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:1523)
	at cider.nrepl.middleware.debug$eval1069$loading__6721__auto____1070.invoke(debug.clj:1)
	at cider.nrepl.middleware.debug$eval1069.invokeStatic(debug.clj:1)
	at cider.nrepl.middleware.debug$eval1069.invoke(debug.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7177)
	at clojure.lang.Compiler.eval(Compiler.java:7166)
	at clojure.lang.Compiler.load(Compiler.java:7636)
	at clojure.lang.RT.loadResourceScript(RT.java:381)
	at clojure.lang.RT.loadResourceScript(RT.java:372)
	at clojure.lang.RT.load(RT.java:459)
	at clojure.lang.RT.load(RT.java:424)
	at clojure.core$load$fn__6839.invoke(core.clj:6126)
	at clojure.core$load.invokeStatic(core.clj:6125)
	at clojure.core$load.doInvoke(core.clj:6109)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invokeStatic(core.clj:5908)
	at clojure.core$load_one.invoke(core.clj:5903)
	at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
	at clojure.core$load_lib.invokeStatic(core.clj:5947)
	at clojure.core$load_lib.doInvoke(core.clj:5928)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$load_libs.invokeStatic(core.clj:5985)
	at clojure.core$load_libs.doInvoke(core.clj:5969)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$require.invokeStatic(core.clj:6007)
	at clojure.core$require.doInvoke(core.clj:6007)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at cider.nrepl$run_deferred_handler$fn__611.invoke(nrepl.clj:38)
	at clojure.lang.Delay.deref(Delay.java:42)
	at clojure.core$deref.invokeStatic(core.clj:2320)
	at clojure.core$deref.invoke(core.clj:2306)
	at cider.nrepl$wrap_debug$fn__679.invoke(nrepl.clj:136)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_enlighten$fn__687.invoke(nrepl.clj:162)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_content_type$fn__637.invoke(nrepl.clj:82)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at nrepl.middleware.caught$wrap_caught$fn__24670.invoke(caught.clj:97)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_refresh$fn__753.invoke(nrepl.clj:336)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_profile$fn__745.invoke(nrepl.clj:299)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_info$fn__703.invoke(nrepl.clj:180)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_clojuredocs$fn__833.invoke(nrepl.clj:481)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_out$fn__737.invoke(nrepl.clj:290)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_version$fn__817.invoke(nrepl.clj:456)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_undef$fn__809.invoke(nrepl.clj:448)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_tracker$fn__801.invoke(nrepl.clj:437)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at nrepl.middleware.print$wrap_print$fn__24641.invoke(print.clj:234)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_macroexpand$fn__721.invoke(nrepl.clj:243)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_ns$fn__729.invoke(nrepl.clj:256)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at nrepl.middleware.session$session$fn__24834.invoke(session.clj:272)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at cider.nrepl$wrap_xref$fn__825.invoke(nrepl.clj:466)
	at nrepl.middleware$wrap_conj_descriptor$fn__24441.invoke(middleware.clj:16)
	at clojure.lang.Var.invoke(Var.java:384)
	at nrepl.server$handle_STAR_.invokeStatic(server.clj:18)
	at nrepl.server$handle_STAR_.invoke(server.clj:15)
	at nrepl.server$handle$fn__24865.invoke(server.clj:27)
	at clojure.core$binding_conveyor_fn$fn__5754.invoke(core.clj:2030)
	at clojure.lang.AFn.call(AFn.java:18)
	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: jdk.javadoc.doclet.Doclet
	at java.base/java.net.URLClassLoader.findClass(Unknown Source)
	at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:69)
	at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
	at clojure.lang.DynamicClassLoader.loadClass(DynamicClassLoader.java:77)
	at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Unknown Source)
	at clojure.lang.RT.classForName(RT.java:2211)
	at clojure.lang.RT.classForNameNonLoading(RT.java:2224)
	at cider.nrepl.inlined_deps.orchard.v0v5v1.orchard.java.parser$eval1948$loading__6721__auto____1949.invoke(parser.clj:1)
	at cider.nrepl.inlined_deps.orchard.v0v5v1.orchard.java.parser$eval1948.invokeStatic(parser.clj:1)
	at cider.nrepl.inlined_deps.orchard.v0v5v1.orchard.java.parser$eval1948.invoke(parser.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:7177)
	at clojure.lang.Compiler.eval(Compiler.java:7166)
	at clojure.lang.Compiler.load(Compiler.java:7636)
	... 182 more

Steps to reproduce the problem

Add an embedded nREPL server to a Clojure project using the method described at the top of the issue, compile that project to an überjar, then attempt to run it under JDK 11 and connect to the nREPL server using CIDER.

Environment & Version information

cider-nrepl version

E.g. 0.22.3

Java version

11.0.4, OpenJDK 64-Bit Server VM, Amazon.com Inc.

Operating system

macOS Mojave 10.14.6

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions