2015-07-30 1 views
2

Mon environnement est Windows 10 x64/Scala 2.11.7/Msys2 plus récent.Scala sous MSys2 - échec de l'initialisation du terminal

Lors de l'exécution Scala de la console MSys2, je vois ce qui suit:

$ 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> 

Quand il va de cmd.exe, il fonctionne comme prévu. Pour déboguer le problème, j'ai essayé le programme Scala suivant:

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

Lors de l'exécution de Msys2, il produit l'erreur suivante:

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) 

Ce que j'ai essayé et cela n'a pas fonctionné:

  • Certains threads sur Internet mentionnent que cela peut être dû à l'absence de runtime VC2008, donc je me suis assuré de l'avoir à la fois pour x64 et x86.
  • Extraire jansi.dll de scala/lib/jline-2.12.1.jar et le placer dans mon répertoire de travail (avec "." Inclus dans java.library.path).
  • À partir d'un nouveau répertoire de base MSys2.
  • shell bash --login -i de cmd.exe (même erreur lors de l'exécution scala)
  • essayer 32 bits et 64 bits JREs

Encore une chose: la question ne porte pas atteinte SBT ; par exemple, lancer "sbt console" me donne une ligne de commande Scala fonctionnelle, bien que de la version 2.10.4.

Répondre

1

Le problème est dû au conflit de noms entre le script shell scala dans le répertoire scala/bin et le scala.bat dans le même répertoire. Msys2 exécute le script shell, tandis que cmd.exe exécute le fichier de commandes. Apparemment, le script shell n'est pas adapté à Msys2, ce qui provoque l'erreur dont j'ai été témoin. L'émission de cmd //c scala.bat à partir de MSys2 aboutit à une ligne de commande Scala fonctionnelle.

Il est aussi trivial d'éditer le script shell scala pour soutenir MSys2: https://gist.github.com/kirillkh/a9ba2e00ef2e901f13bf

J'ai ouvert une demande de traction avec ce changement sur le GitHub: https://github.com/scala/scala/pull/4674

+0

Salut, je rencontre également ce problème 'N'a pas pu initialise la classe org.fusesource.jansi.internal.Kernel32' avec cygwin et cmd sous Windows7 x64. Je n'ai pas d'installation de scala ou de sbt sur ma machine, j'utilise seulement le plugin scala de gradlew (2.8). Je n'ai pas, ne peut pas trouver n'importe quel fichier scala.bat ou script shell scala. Avez-vous une idée de comment corriger cette erreur dans une telle situation? – mrt181

+0

Eh bien, il doit y avoir un script shell scala qui est en cours d'exécution si vous obtenez ce message d'erreur. Essayez d'émettre la commande 'quelle scala' et voyez ce que cela donne, ou cherchez plus longuement. Je ne suis pas familier avec gradelw. – kirillkh