如何在 Java 11 中运行 Scala REPL?

huangapple go评论114阅读模式
英文:

How to run scala repl with java 11?

问题

我已经在我的Ubuntu 20.04上安装了Java 11;

Java版本:

  1. $ java -version
  2. openjdk version "11.0.8" 2020-07-14
  3. OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu120.04)
  4. OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)

Scala版本:

  1. $ scala -version
  2. Scala代码运行器版本 2.11.12 -- 版权所有 2002-2017LAMP/EPFL

当我尝试运行Scala REPL时,我遇到了以下错误:

  1. 欢迎使用Scala 2.11.12 (OpenJDK 64-Bit Server VMJava 11.0.8)
  2. 键入表达式进行评估。或尝试 :help
  3. 主线程中的异常 "main" java.lang.NoClassDefFoundError: javax/script/Compilable
  4. at scala.tools.nsc.interpreter.ILoop.createInterpreter(ILoop.scala:118)
  5. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$startup$1$1$$anonfun$apply$1.apply(ILoop.scala:971)
  6. ...

如果我尝试使用Java 8运行(使用update-alternatives --config java更改版本),它可以正常工作:

REPL:

  1. $ scala
  2. cat: /usr/lib/jvm/java-8-openjdk-amd64/jre/release: 文件或目录不存在
  3. 欢迎使用Scala 2.11.12 (OpenJDK 64-Bit Server VMJava 1.8.0_265)
  4. 键入表达式进行评估。或尝试 :help

如何让Scala REPL在Java 11中正常工作?我还每次在切换Java 8和11之间时更改了我的.zshrc文件中的JAVA_HOME

英文:

I've installed java 11 on my ubuntu 20.04;

The java version:

  1. $ java -version
  2. penjdk version "11.0.8" 2020-07-14
  3. OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu120.04)
  4. OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)

The scala version:

  1. $ scala -version
  2. Scala code runner version 2.11.12 -- Copyright 2002-2017, LAMP/EPFL

When i try to run the scala repl i got the error:

  1. Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 11.0.8).
  2. Type in expressions for evaluation. Or try :help.
  3. Exception in thread "main" java.lang.NoClassDefFoundError: javax/script/Compilable
  4. at scala.tools.nsc.interpreter.ILoop.createInterpreter(ILoop.scala:118)
  5. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$startup$1$1$$anonfun$apply$1.apply(ILoop.scala:971)
  6. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$startup$1$1$$anonfun$apply$1.apply(ILoop.scala:971)
  7. scala> at scala.tools.nsc.interpreter.ILoop.savingReader(ILoop.scala:96)
  8. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$startup$1$1.apply(ILoop.scala:970)
  9. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:990)
  10. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:891)
  11. at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:891)
  12. at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97)
  13. at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:891)
  14. at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74)
  15. at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
  16. at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
  17. at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
  18. at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
  19. [ERROR] Failed to disable litteral next character
  20. java.lang.InterruptedException
  21. at java.base/java.lang.Object.wait(Native Method)
  22. at java.base/java.lang.Object.wait(Object.java:328)
  23. at java.base/java.lang.ProcessImpl.waitFor(ProcessImpl.java:495)
  24. at jline.internal.TerminalLineSettings.waitAndCapture(TerminalLineSettings.java:339)
  25. at jline.internal.TerminalLineSettings.exec(TerminalLineSettings.java:311)
  26. at jline.internal.TerminalLineSettings.stty(TerminalLineSettings.java:282)
  27. at jline.internal.TerminalLineSettings.undef(TerminalLineSettings.java:158)
  28. at jline.UnixTerminal.disableLitteralNextCharacter(UnixTerminal.java:194)
  29. at jline.console.ConsoleReader.readLine(ConsoleReader.java:2450)
  30. at jline.console.ConsoleReader.readLine(ConsoleReader.java:2373)
  31. at jline.console.ConsoleReader.readLine(ConsoleReader.java:2361)
  32. at scala.tools.nsc.interpreter.jline.InteractiveReader.readOneLine(JLineReader.scala:59)
  33. at scala.tools.nsc.interpreter.InteractiveReader$class.readLine(InteractiveReader.scala:38)
  34. at scala.tools.nsc.interpreter.jline.InteractiveReader.readLine(JLineReader.scala:27)
  35. at scala.tools.nsc.interpreter.SplashReader.readLine(InteractiveReader.scala:142)
  36. at scala.tools.nsc.interpreter.SplashLoop.run(InteractiveReader.scala:71)
  37. at java.base/java.lang.Thread.run(Thread.java:834)

If i try to run using java8 (changing the version using update-alternatives --config java) it works:

Repl:

  1. $ scala
  2. cat: /usr/lib/jvm/java-8-openjdk-amd64/jre/release: Arquivo ou diretório não encontrado
  3. Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_265).
  4. Type in expressions for evaluation. Or try :help.
  5. scala>

How can i get scala repl to work along java 11? i've also changed the JAVA_HOME on my .zshrc file everytime i change between java8 and 11.

答案1

得分: 4

Scala 2.11.12 应当与 JDK 11 兼容,参见 版本兼容性表

  1. ## 版本兼容性表
  2. | JDK 版本 | 最低 Scala 版本 | 推荐 Scala 版本 |
  3. |:----------:|:-------------------------------|:---------------------------------------------------------|
  4. | 13, 14 | 2.13.2, 2.12.11 | 2.13.3, 2.12.12 |
  5. | 12 | 2.13.1, 2.12.9 | 2.13.3, 2.12.12 |
  6. | 11 | 2.13.0, 2.12.4, 2.11.12 | 2.13.3, 2.12.12, 2.11.12 |
  7. | 8 | 2.13.0, 2.12.0, 2.11.0, 2.10.2 | 2.13.3, 2.12.12, 2.11.12, 2.10.7 |
  8. | 6, 7 | 2.11.0, 2.10.0 | 2.11.12, 2.10.7 |

在我的机器上执行

  1. scala --scala-version 2.11.12 -C--jvm=11

使用 scala-runners 没有报错

  1. ~ scala --scala-version 2.11.12 -C--jvm=11
  2. 欢迎使用 Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 11.0.7)。
  3. 输入表达式以进行评估。或者尝试使用 :help
  4. scala> sys.props("java.specification.version")
  5. res0: String = 11
  6. scala> util.Properties.versionString
  7. res1: String = version 2.11.12
  8. scala>

注意 -C--jvm=11 参数指定了由 coursier 下载的 JDK 版本。

英文:

Scala 2.11.12 should be compatible with JDK 11 according to Version compatibility table

  1. ## Version compatibility table
  2. | JDK version | Minimum Scala versions | Recommended Scala versions |
  3. |:-----------:|:---------------------------------|:-----------------------------------------------------------|
  4. | 13, 14 | 2.13.2, 2.12.11 | 2.13.3, 2.12.12 |
  5. | 12 | 2.13.1, 2.12.9 | 2.13.3, 2.12.12 |
  6. | 11 | 2.13.0, 2.12.4, 2.11.12 | 2.13.3, 2.12.12, 2.11.12 |
  7. | 8 | 2.13.0, 2.12.0, 2.11.0, 2.10.2 | 2.13.3, 2.12.12, 2.11.12, 2.10.7 |
  8. | 6, 7 | 2.11.0, 2.10.0 | 2.11.12, 2.10.7 |

On my machine executing

  1. scala --scala-version 2.11.12 -C--jvm=11

with scala-runners gives no error

  1. ~ scala --scala-version 2.11.12 -C--jvm=11
  2. Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 11.0.7).
  3. Type in expressions for evaluation. Or try :help.
  4. scala> sys.props("java.specification.version")
  5. res0: String = 11
  6. scala> util.Properties.versionString
  7. res1: String = version 2.11.12
  8. scala>

Note the -C--jvm=11 argument specifies JDK version which is downloaded by coursier.

huangapple
  • 本文由 发表于 2020年10月6日 23:43:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/64229275.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定