dundalek/closh

rebel-readline does not work when compiled with Graal native-image

dundalek opened this issue · 0 comments

I tried to compile the rebel-readline frontend with Graal native-image in the feature/sci-rebel branch. When running the binary it fails with following error:

May 02, 2020 4:55:07 PM org.jline.utils.Log logr
WARNING: Unable to create a system terminal, creating a dumb terminal (enable debug logging for more information)
Exception in thread "main" java.lang.NullPointerException
	at java.io.Reader.<init>(Reader.java:167)
	at org.jline.utils.InputStreamReader.<init>(InputStreamReader.java:135)
	at org.jline.utils.InfoCmp.getCapabilitiesByName(InfoCmp.java:518)
	at org.jline.utils.InfoCmp.parseInfoCmp(InfoCmp.java:569)
	at org.jline.terminal.impl.AbstractTerminal.parseInfoCmp(AbstractTerminal.java:176)
	at org.jline.terminal.impl.DumbTerminal.<init>(DumbTerminal.java:102)
	at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:350)
	at org.jline.terminal.TerminalBuilder.build(TerminalBuilder.java:219)
	at rebel_readline.jline_api$create_terminal.invokeStatic(jline_api.clj:62)
	at rebel_readline.jline_api$create_terminal.doInvoke(jline_api.clj:59)
	at clojure.lang.RestFn.invoke(RestFn.java:397)
	at closh.zero.frontend.sci$repl.invokeStatic(sci.clj:127)
	at closh.zero.frontend.sci$repl.invoke(sci.clj:126)
	at closh.zero.frontend.sci$_main.invokeStatic(sci.clj:171)
	at closh.zero.frontend.sci$_main.doInvoke(sci.clj:166)
	at clojure.lang.RestFn.invoke(RestFn.java:397)
	at clojure.lang.AFn.applyToHelper(AFn.java:152)
	at clojure.lang.RestFn.applyTo(RestFn.java:132)
	at closh.zero.frontend.sci.main(Unknown Source)

The reason seems to be that jline3 library tries to load terminal info resources using relative path which graal does not seem to support: oracle/graal#2250.

I tried to change the resource loading to use absolute path in local version of jline. To use the local jline-terminal version I added following into deps.edn:

{:deps
 { ...
  com.bhauman/rebel-readline {:mvn/version "0.1.4"
                              :exclusions [org.jline/jline-terminal]}
  org.jline/jline-terminal {:local/root "/local/path/to/jline3/terminal"}}}

But then I get (I run Java11, not sure why it is trying to pick up 9 profile):

Error building classpath. 1 problem was encountered while building the effective model for org.jline:jline-parent:3.12.2-SNAPSHOT
[ERROR] Failed to determine Java version for profile java9 @

org.apache.maven.model.building.ModelBuildingException: 1 problem was encountered while building the effective model for org.jline:jline-parent:3.12.2-SNAPSHOT
[ERROR] Failed to determine Java version for profile java9 @

	at org.apache.maven.model.building.DefaultModelProblemCollector.newModelBuildingException(DefaultModelProblemCollector.java:197)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:481)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:423)
	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:413)
	at clojure.tools.deps.alpha.extensions.pom$read_model.invokeStatic(pom.clj:62)
	at clojure.tools.deps.alpha.extensions.pom$read_model.invoke(pom.clj:53)
	at clojure.tools.deps.alpha.extensions.pom$read_model_file.invokeStatic(pom.clj:67)
	at clojure.tools.deps.alpha.extensions.pom$read_model_file.invoke(pom.clj:65)
	at clojure.tools.deps.alpha.extensions.pom$eval822$fn__824.invoke(pom.clj:103)
	at clojure.lang.MultiFn.invoke(MultiFn.java:244)
	at clojure.tools.deps.alpha$expand_deps$fn__1161.invoke(alpha.clj:192)
	at clojure.tools.deps.alpha$expand_deps.invokeStatic(alpha.clj:191)
	at clojure.tools.deps.alpha$expand_deps.invoke(alpha.clj:169)
	at clojure.tools.deps.alpha$resolve_deps.invokeStatic(alpha.clj:237)
	at clojure.tools.deps.alpha$resolve_deps.invoke(alpha.clj:217)
	at clojure.tools.deps.alpha.script.make_classpath2$create_classpath.invokeStatic(make_classpath2.clj:55)
	at clojure.tools.deps.alpha.script.make_classpath2$create_classpath.invoke(make_classpath2.clj:47)
	at clojure.tools.deps.alpha.script.make_classpath2$run_core.invokeStatic(make_classpath2.clj:81)
	at clojure.tools.deps.alpha.script.make_classpath2$run_core.invoke(make_classpath2.clj:72)
	at clojure.tools.deps.alpha.script.make_classpath2$run.invokeStatic(make_classpath2.clj:101)
	at clojure.tools.deps.alpha.script.make_classpath2$run.invoke(make_classpath2.clj:95)
	at clojure.tools.deps.alpha.script.make_classpath2$_main.invokeStatic(make_classpath2.clj:146)
	at clojure.tools.deps.alpha.script.make_classpath2$_main.doInvoke(make_classpath2.clj:118)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.core$apply.invokeStatic(core.clj:665)
	at clojure.main$main_opt.invokeStatic(main.clj:514)
	at clojure.main$main_opt.invoke(main.clj:510)
	at clojure.main$main.invokeStatic(main.clj:664)
	at clojure.main$main.doInvoke(main.clj:616)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.main.main(main.java:40)

Not sure how can I proceed, I am not very familiar with building maven artifacts.