2015-07-30 3 views
2

Моей средой является Windows 10 x64/Scala 2.11.7/Msys2 последняя.Scala под MSys2 - отказ инициализации терминала

При запуске Scala от MSys2 консоли, я вижу следующее:

$ scala 
[ERROR] Terminal initialization failed; falling back to unsupported 
java.lang.NoClassDefFoundError: Could not initialize class org.fusesource.jansi.internal.Kernel32 
    at org.fusesource.jansi.internal.WindowsSupport.getConsoleMode(WindowsSupport.java:50) 
    at jline.WindowsTerminal.getConsoleMode(WindowsTerminal.java:204) 
    at jline.WindowsTerminal.init(WindowsTerminal.java:82) 
    at jline.TerminalFactory.create(TerminalFactory.java:101) 
    at jline.TerminalFactory.get(TerminalFactory.java:158) 
    at jline.console.ConsoleReader.<init>(ConsoleReader.java:229) 
    at jline.console.ConsoleReader.<init>(ConsoleReader.java:221) 
    at jline.console.ConsoleReader.<init>(ConsoleReader.java:209) 
    at scala.tools.nsc.interpreter.jline.JLineConsoleReader.<init>(JLineReader.scala:61) 
    at scala.tools.nsc.interpreter.jline.InteractiveReader.<init>(JLineReader.scala:33) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$scala$tools$nsc$interpreter$ILoop$$instantiate$1$1.apply(ILoop.scala:865) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$scala$tools$nsc$interpreter$ILoop$$instantiate$1$1.apply(ILoop.scala:862) 
    at scala.tools.nsc.interpreter.ILoop.scala$tools$nsc$interpreter$ILoop$$mkReader$1(ILoop.scala:871) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$15$$anonfun$apply$8.apply(ILoop.scala:875) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$15$$anonfun$apply$8.apply(ILoop.scala:875) 
    at scala.util.Try$.apply(Try.scala:192) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$15.apply(ILoop.scala:875) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$15.apply(ILoop.scala:875) 
    at scala.collection.immutable.Stream.map(Stream.scala:418) 
    at scala.tools.nsc.interpreter.ILoop.chooseReader(ILoop.scala:875) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$apply$mcZ$sp$2.apply(ILoop.scala:916) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:916) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:911) 
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:911) 
    at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97) 
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:911) 
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74) 
    at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87) 
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98) 
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103) 
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 

Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> 

При запуске из cmd.exe, она работает, как ожидалось. Для отладки вопрос, я попробовал следующую программу Scala:

object Test extends App { 
    println(org.fusesource.jansi.internal.WindowsSupport.getConsoleMode) 
} 

При запуске из Msys2, она производит следующее сообщение об ошибке:

java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path] 
    at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182) 
    at org.fusesource.hawtjni.runtime.Library.load(Library.java:140) 
    at org.fusesource.jansi.internal.Kernel32.<clinit>(Kernel32.java:37) 
    at org.fusesource.jansi.internal.WindowsSupport.getConsoleMode(WindowsSupport.java:50) 
    at Test$.delayedEndpoint$Test$1(Test.scala:5) 
    at Test$delayedInit$body.apply(Test.scala:1) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:76) 
    at scala.App$$anonfun$main$1.apply(App.scala:76) 
    at scala.collection.immutable.List.foreach(List.scala:381) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 
    at scala.App$class.main(App.scala:76) 
    at Test$.main(Test.scala:1) 
    at Test.main(Test.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at scala.reflect.internal.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:70) 
    at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31) 
    at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:101) 
    at scala.reflect.internal.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:70) 
    at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101) 
    at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:22) 
    at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39) 
    at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:29) 
    at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39) 
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:65) 
    at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87) 
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98) 
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103) 
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 

То, что я пытался и не получилось:

  • Некоторые потоки в Интернете упоминают, что это может быть вызвано отсутствием времени выполнения VC2008, поэтому я убедился, что у меня это как для x64, так и для x86.
  • Извлечь jansi.dll из scala/lib/jline-2.12.1.jar и поместить его в мой рабочий каталог (с «.», Включенным в java.library.path).
  • Начиная со свежей домашней директории MSys2.
  • работает Баш --login -i из cmd.exe (та же ошибка при запуске Scala)
  • пытается 32-разрядные и 64-разрядные JREs

еще одно: проблема не влияет на SBT ; например, запуск «sbt console» дает мне рабочую командную строку Scala, хотя и версии 2.10.4.

ответ

1

Проблема вызвана столкновением имен между сценарием оболочки scala в каталоге scala/bin и scala.bat в том же каталоге. Msys2 запускает сценарий оболочки, а cmd.exe запускает командный файл. По-видимому, сценарий оболочки не подходит для Msys2, что вызывает ошибку, которую я наблюдал. Выдача cmd //c scala.bat из MSys2 приводит к функциональной командной строке Scala.

Это также тривиально для редактирования сценария scala оболочки для поддержки MSys2: https://gist.github.com/kirillkh/a9ba2e00ef2e901f13bf

Я открыл запрос тянуть с этим изменением на GitHub: https://github.com/scala/scala/pull/4674

+0

Привет, я также сталкиваюсь с этой проблемой 'не мог инициализировать класс org.fusesource.jansi.internal.Kernel32' с cygwin и cmd на Windows7 x64. У меня нет установки scala или sbt на моей машине, я использую только плагин scala (2.8). У меня нет, не могу найти файл scala.bat или scala shell. Вы знаете, как исправить эту ошибку в такой ситуации? – mrt181

+0

Ну, должен быть сценарий оболочки scala, который запускается, если вы получаете это сообщение об ошибке. Попробуйте выдать команду «scala» и посмотреть, что она дает, или искать более широко. Я не знаком с граделем. – kirillkh

Смежные вопросы