Skip to content

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

@dundalek

Description

@dundalek

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions