3

私はに遭遇していakka.ConfigurationException: Akka JAR version [2.1.0] does not match the provided config version [2.2.3]ます。私の推測では、どういうわけか、$SCALA_HOME/lib/akka-actors.jarSBT によって管理される Akka JAR と一緒にクラスパスに到達しているということです。

この問題を示すために、単純なスタンドアロン SBT プロジェクトを作成しました (以下を参照)。私の $SCALA_HOME は Scala 2.10.3 を指しています。Build.scala では、明示的に設定scalaHomeしています$SCALA_HOME

project/Build.scala

import sbt._
import sbt.Keys._

object ApplicationBuild extends Build {
  val appName     = "akka-version-problem"
  val appVersion  = "0.1-SNAPSHOT"

  val getJars = TaskKey[Unit]("get-jars")
  val getJarsTask = getJars <<= (target, fullClasspath in Compile) map { (target, cp) =>
    println(cp map { _.data } filter { _.getAbsolutePath.contains("lib") } mkString "\n")
    println(cp map { _.data } filter { _.getAbsolutePath.contains("akka") } mkString "\n")
  }

  lazy val root = Project("root", file(".")).settings(
    scalaVersion := "2.10.3",

    scalaHome := Some(file(System.getenv("SCALA_HOME"))),

    autoScalaLibrary := false,

    libraryDependencies ++= Seq(
      "com.typesafe.akka" %% "akka-actor" % "2.2.3"
    ),

    getJarsTask
  )
}

src/main/scala/com/example/Main.scala

package com.example

import akka.actor.ActorSystem

object Main extends App {
  val system = ActorSystem("AkkaDemoSystem")
  system.shutdown()
}

実行すると、出力にsbt get-jars表示されません実行すると、次のようになります。$SCALA_HOME/lib/akka-actors.jarsbt run

[error] (run-main) 44c2d48a-8899-43f9-804b-55cbf739b08bakka.ConfigurationException: Akka JAR version [2.1.0] does not match the provided config version [2.2.3]
44c2d48a-8899-43f9-804b-55cbf739b08bakka.ConfigurationException: Akka JAR version [2.1.0] does not match the provided config version [2.2.3]
    at akka.actor.ActorSystem$Settings.<init>(ActorSystem.scala:172)
    at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:465)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:111)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:93)
    at com.example.Main$delayedInit$body.apply(Main.scala:6)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:71)
    at scala.App$$anonfun$main$1.apply(App.scala:71)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
    at scala.App$class.main(App.scala:71)
    at com.example.Main$.main(Main.scala:5)
    at com.example.Main.main(Main.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)

明らかな何かが欠けていますか?他の誰かがこれに遭遇しましたか?

4

1 に答える 1

3

ここでの問題は、akka-actors.jar がscala ディストリビューションの一部であることです。Sbt は、デフォルトで、これらすべての jar をクラスパスに含めます。SO、scala ディストリビューションからの Akka バージョン、直接依存するバージョンになります。

それだけでなく、scala-actors、scala-reflect などを含めています。これが必要な場合は、すばらしいことです。

必要以上の jar を使用したくない場合は、scalaInstance使用する を直接作成する必要があります。構築方法についてはhttp://www.scala-sbt.org/release/api/index.html#sbt.ScalaInstance $ を参照してください (これらの 1 つが scalaHome を使用していることがわかります)。

次のようなことをお勧めします (注: sbt 0.13 コード):

scalaInstance := {
    val homeDir = file("/path/to/scala-home")
    val jars = (homeDir ** ".jar").get
    val notAkka = jars filterNot (_ contains "akka")
    val scalaLib = ScalaInstance.scalaJar(homeDir, "scala-library.jar")
    val compilerLib = ScalaInstance.scalaJar(homeDir, "scala-compiler.jar")
    ScalaInstance(scalaLib, compilerLib, notAkka:_*)(state.classLoaderCache.apply _)
}

これにより、非推奨の警告が発生します。これは、scalaHome を使用している場合、scala からすべてのデフォルト モジュールが必要であると想定しているためです。これは当てはまらないので、無視してかまいません。

Viktor が言うように、Scala には sbt の解決メカニズムを使用することをお勧めします。これを行うと、デフォルトでクラスローダーのキャッシングが行われ、アーティファクトが一度だけダウンロードされます。現実には、sbt はプロジェクトの scalaHome が構成されていることを認識する前に、ビルドをコンパイルするためにとにかく scala のバージョンをダウンロードする必要があります (これは scala 自体を使用して指定するためです)。

それが役立つことを願っています!

于 2013-10-26T13:36:40.810 に答える