【问题标题】:Failed to created JLineReader (Scala REPL)无法创建 JLineReader (Scala REPL)
【发布时间】:2011-06-15 16:30:32
【问题描述】:

当我在 Windows 7 64 位上启动 REPL(在我的 Windows XP 笔记本电脑上运行正常)时,我收到以下消息:

Failed to created JLineReader: java.lang.NoClassDefFoundError: Could not initial
ize class org.fusesource.jansi.internal.Kernel32
Falling back to SimpleReader.

这意味着历史记录和代码完成不起作用。

我已经用谷歌搜索了这个问题,但我找不到任何解决方案。我没有安装 sbt 或 Maven 或 ivy,所以我认为这与这些无关。我的 %SCALA_HOME% 设置正确。

在这个线程:http://www.scala-lang.org/node/9855 中有一些关于 Scala 2.8 的依赖,但我不明白如何在我的系统上解决这个问题。

根据此线程中的建议:http://www.scala-lang.org/node/9795 我已经更新了我的 MS C++ 库,但仍然存在问题。我运行了帖子 #11 中建议的代码并得到以下信息:

scala> println(System.getProperty("java.library.path"))

C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\
Windows;C:\Program Files\Common Files\Microsoft Shared\Windows Live;c:\Program F
iles (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Win
dows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files
(x86)\QuickTime\QTSystem\;C:\Program Files (x86)\ZipGenius 6\;C:\Program Files (
x86)\Java\jdk1.6.0_22\bin;C:\Program Files\SlikSvn\bin\;C:\Program Files\apache-
ant-1.8.2\bin;C:\Program Files\TortoiseSVN\bin;C:\cygwin\bin;C:\Program Files (x
86)\Notepad++;C:\Program Files (x86)\groovy-1.7.10\bin;C:\Program Files\scala2.9
\bin

scala> println(org.fusesource.jansi.internal.WindowsSupport.getConsoleMode)

java.lang.NoClassDefFoundError: Could not initialize class org.fusesource.jansi.
internal.Kernel32
        at org.fusesource.jansi.internal.WindowsSupport.getConsoleMode(WindowsSu
pport.java:48)
        at .<init>(<console>:8)
        at .<clinit>(<console>)
        at .<init>(<console>:11)
        at .<clinit>(<console>)
        at $export(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:592)

        at scala.tools.nsc.interpreter.IMain$Request$$anonfun$10.apply(IMain.sca
la:828)
        at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:4
3)
        at scala.tools.nsc.io.package$$anon$2.run(package.scala:31)
        at java.lang.Thread.run(Unknown Source)

感谢任何帮助使其正常工作!

【问题讨论】:

  • @Daniel 使用 Izpack 安装程序的普通方式
  • 嗯。尝试通过 Typesafe 的安装程序安装:它似乎比 izpack 更智能。

标签: scala read-eval-print-loop


【解决方案1】:

编辑:解决方案是输入 del %TEMP%\jansi.dll - 原因请参见下面 huynhjl 的评论。


REPL 似乎与 64 位 JRE 不兼容。我将高级系统设置中的JAVA_HOME 环境变量更改为使用32 位版本,即从C:\Program Files\Java\jre6 更改为C:\Program Files (x86)\Java\jdk1.6.0_22

然后我必须通过从

更改第 24 行来更正 scala.bat 文件中的错误(仍然存在)
    if exist "%JAVA_HOME%\bin\java.exe" set _JAVACMD=%JAVA_HOME%\bin\java.exe

    if exist "%JAVA_HOME%\bin\java.exe" set "_JAVACMD=%JAVA_HOME%\bin\java.exe"

现在可以正常使用了。

来自命令行的java 足够聪明,可以使用 64 位运行时,而不管您的 Path 或 JAVA_HOME 变量如何,但scala 使用您在 JAVA_HOME 中指定的任何内容(这实际上可能是它应该的方式)。但是 64 位运行时比 32 位快很多,所以我想使用它。

目前看来,我必须在功能齐全的 REPL 和在 64 位 JVM 上运行之间做出选择。 :(

【讨论】:

  • 我有一个理论,但我没有在我的 win64 安装前验证它。 jline.jar 中捆绑了两个jansi.dll,一个用于 32 位,一个用于 64 位。根据sun.arch.data.model 系统属性(32 或64)的值选择被拾取的那个。解压后,dll 不会根据时间戳刷新。所以我的猜测是你首先运行了解压 32 位 dll 的 32 位版本。启动 64 位 JVM 时,jansi.dll 不兼容。所以尝试del %TEMP%\jansi.dll,然后在 64 位上启动你的 scala,看看它是否有效。
  • 我在问题跟踪器中提交了以下问题:issues.scala-lang.org/browse/SI-4703
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2013-08-04
  • 2013-10-10
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多