我在运行最新的游戏框架2.3时遇到了问题。
它编译得很好,但是当我activator run
时会发生这个错误:
java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;
我在每个build.sbt文件中明确尝试过scalaVersion,它们是相同的。
我尝试了几个像activator clean
,完全删除os sbt缓存和本地repo sbt的东西,更新了最新版本的依赖,但没有成功。
我定义了scala版本。
我目前的依赖关系是:
我尝试使用%%
和强制_2.11
作为依赖项的名称。
其他重要文件
当我完全清理缓存时,它会毫无理由地下载scala 2.10.4: 在这个download log它说sbt需要旧的scala。 知道为什么会这样吗?
有什么想法吗?
答案 0 :(得分:1)
首先,使用哪个版本的Scala生成构建并不重要。构建系统可以使用版本2.10.4,这不会阻止您的代码使用版本2.11.1。
要查看scala版本的问题,您应该考虑直接在build.sbt
中添加的设置会添加到根项目中,但不会添加到其他项目中。您可以通过一个最小的项目来看到这一点,例如:
$ cat build.sbt
scalaVersion := "2.11.1"
lazy val subproj = project in (file("subproj"))
然后sbt的输出如下:
> show scalaVersion
[info] subproj/*:scalaVersion
[info] 2.10.4
[info] sbttest/*:scalaVersion
[info] 2.11.1
那么,如何解决这个问题?
我们可以创建一个包含lazy val
的{{1}},并使用Seq[Setting[_]]
方法将其添加到子项目定义中。
这是一个示例settings()
,它为所有项目添加了相同的设置:
build.sbt
$ cat build.sbt
lazy val root = project.in(file("."))
.aggregate(subproj)
.dependsOn(subproj)
.settings(commonSettings: _*)
lazy val subproj = project.in(file("subproj"))
.settings(commonSettings: _*)
lazy val commonSettings = Seq(
scalaVersion := "2.11.1"
)
是必需的,因为_*
被定义为需要settings()
而不是Setting[_]*
,因此Seq[Setting[_]]
会在两种类型之间进行转换。另见:What does param: _* mean in Scala?
sbt的输出是:
_*
这种方法可以轻松应用于您的构建。
答案 1 :(得分:0)
问题与我在lib文件夹中发现的一些手动添加的jar有关,这些jar导致了build.sbt中定义的项目依赖项问题。
找出的唯一方法是生成activator dist
并查找具有不同版本的类似依赖项,因为在依赖关系图中没有冲突
答案 2 :(得分:0)
您正在以错误的方式定义依赖项。
使用SBT时,请勿使用:
"org.mydep" % "mydep_2.11" % "1.0.0"
改为使用:
"org.mydep" %% "mydep" % "1.0.0"
%%
运算符会自动附加当前版本的当前Scala版本。如果你使用针对其他Scala版本构建的依赖项,那么你将会遇到奇怪的错误。
还要确保在某处明确指定Scala版本:
scalaVersion := "2.11.1"