Skip to content

MainGenericRunner: do not load jline classes until they are needed #11654

Closed
@unkarjedy

Description

@unkarjedy

In Scala Plugin we use MainGenericRunner.main to start Scala REPL instance. Usage example:

"C:\Program Files\Java\jdk1.8.0_191\bin\java.exe" -Djline.terminal=NONE \
  -Dfile.encoding=UTF-8 \
  -classpath \
  "~\.ivy2\cache\org.scala-lang\scala-compiler\jars\scala-compiler-2.13.0.jar;~\.ivy2\cache\org.scala-lang\scala-library\jars\scala-library-2.13.0.jar;~\.ivy2\cache\org.scala-lang\scala-reflect\jars\scala-reflect-2.13.0.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar;" \
  scala.tools.nsc.MainGenericRunner \
  -usejavacp

In Scala <=2.12 It works ok even if jline.x.jar is not present in the classpath.
Unfortunately, in 2.13 some changes were made that make it throw java.lang.NoClassDefFoundError exception.
The behaviour is even observed if -Xnojline parameter (Do not use JLine for editing) is passed explicitly (https://docs.scala-lang.org/overviews/compiler-options/index.html). It's strange that it tries to resolve Jline even if it doesn't need it.

AFAIU this is because some Jline stuff is still referenced in some classes and is being resolved during class loading:

related issues:
https://youtrack.jetbrains.com/issue/SCL-15948
https://youtrack.jetbrains.com/issue/SCL-15818

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions