2016-04-04 17 views
5

Ho un avvertimento che conducono a errore di esecuzione:scala Incoerente biblioteca versione

[info] Set current project to calculator (in build file:/home/guillaume/projects/scala/2/) 
[info] Updating {file:/home/guillaume/projects/scala/2/}root... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[warn] Scala version was updated by one of library dependencies: 
[warn] * org.scala-lang:scala-library:2.10.5 -> 2.11.1 
[warn] To force scalaVersion, add the following: 
[warn] ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) } 
[warn] Run 'evicted' to see detailed eviction warnings 
[info] Compiling 3 Scala sources to /home/guillaume/projects/scala/2/target/scala-2.10/classes... 
[success] Total time: 9 s, completed Apr 5, 2016 12:16:04 AM 

Questo è strano perché la mia versione Scala è> 2.11:

$ scala -version 
Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL 
$sbt sbtVesion 
[info] 0.13.9 

mio build.sbt:

lazy val root = (project in file(".")). 
    settings(
    name := "calculator", 
    libraryDependencies += "jline" % "jline" % "2.12", 
    libraryDependencies += "com.typesafe.akka" % "akka-actor_2.11" % "2.3.4" 
) 

Semplicemente non capisco perché la mia libreria di scala sia obsoleta.

risposta

14

La versione di Scala utilizzata dalla build SBT è determinata dalla configurazione SBT, non dalla versione di sistema di Scala. La versione predefinita Scala per la SBT 0.13 è 2.10, ma è possibile cambiarlo con la seguente impostazione nel build.sbt:

scalaVersion := "2.11.8" 

Il fatto che la versione Scala del progetto SBT non dipende dal sistema versione Scala (se ci anche uno) è in realtà abbastanza utile, significa che puoi avere progetti che si sovrappongono per più versioni di Scala, che puoi costruire progetti su macchine che non hanno installato Scala, ecc.

Un'altra nota: è una buona idea per evitare questo tipo di discrepanza usando la sintassi %% per le dipendenze di Scala-es. questo:

libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.3.4" 

Invece di questo:

libraryDependencies += "com.typesafe.akka" % "akka-actor_2.11" % "2.3.4" 

Il %% prima che dice il nome artefatto "utilizzare questo nome, ma con suffisso _<Scala epoch version>.<Scala major version> per qualsiasi sia la versione Scala attualmente configurato è".

+0

Grazie, l'aggiunta di 'scalaVersion' ha risolto il mio problema. Ma aggiungendo il '%%' al mio 'libraryDependencies 'aggiungi un altro avviso:' jline # jline_2.11; 2.12: non trovato 'e' com.typesafe.akka # akka-actor_2.11_2.11; 2.3.4: non found'. Ma senza '%%' il programma funziona perfettamente! – Moebius

+1

Ci sono due problemi: JLine non è una libreria Scala, quindi non è necessario il doppio '%%' o '_2.11'-la versione originale è corretta. Per Akka, hai bisogno solo di uno dei due, dal momento che esprimono la stessa cosa. Suggerirei la versione '%%'. –

+1

E 'corss CrossVersion.full' è molto utile per le dipendenze che richiedono la versione completa come' ammonite-repl'. –