【发布时间】:2016-03-22 23:36:43
【问题描述】:
我正在从事一个已经存在了几年但对我来说是新的 Scala 项目。我的任务是将它从 Scala 2.9.3 升级到 2.11.7,以及它的依赖项。我已经克服了错误和警告,但我无法让项目在 SBT 中成功编译。我总是在几乎同一个地方得到一个 StackOverflowError 。 stacktrace 看起来是这样的,但是细节会随着 Xss 设置而变化(目前是 4M,但尝试过高达 24M):
java.lang.StackOverflowError
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:698)
at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5395)
at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5422)
at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5369)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5373)
at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5471)
at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5479)
at scala.tools.nsc.transform.Erasure$Eraser.adaptMember(Erasure.scala:644)
at scala.tools.nsc.transform.Erasure$Eraser.typed1(Erasure.scala:698)
at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5395)
at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedInternal(Typers.scala:5422)
SBT_OPTS 如下所示:
-Xmx2G -Xss4M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
我可以在 Intellij 中成功“制作”该项目,其他人可以从 GitHub 中提取我的更改并在 sbt 中编译该项目,因此问题似乎是我的机器本地问题(最近的四核 Macbook Pro 具有 16GB RAM )。其他 Scala/sbt 项目在这台机器上为我成功编译。
以下是其他相关细节:
Scala version: 2.11.7
Java version: java version "1.8.0_66" (build 1.8.0_66-b17)
sbt version: 0.13.7 (have also tried 0.13.9)
我已经完全重建了 ivy2 缓存并清除了 lib_managed 目录。 scala-compiler.jar 的版本与在至少一台可以成功“sbt 编译”代码的机器上使用的版本相同。我重新安装了 sbt(通过 brew remove sbt,手动删除 ~/.sbt 目录,然后 brew install sbt)。
我没有尝试在错误发生时隔离正在编译的源代码行。我假设在某处寻找配置问题或依赖冲突会更有效率。
我们将不胜感激任何有关进一步故障排除的建议。
[已添加...] 补充一点可能会有所帮助,作为实验,我从https://github.com/scala/scala 下载了 Scala 语言源代码,并在尝试sbt compile 时遇到了以下非常相似的错误:
java.lang.StackOverflowError
at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.outerValue(ExplicitOuter.scala:229)
at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:441)
at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:352)
at scala.reflect.internal.Trees$class.itransform(Trees.scala:1345)
at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:44)
at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.scala$reflect$internal$Trees$UnderConstructionTransformer$$super$transform(ExplicitOuter.scala:219)
at scala.reflect.internal.Trees$UnderConstructionTransformer$class.transform(Trees.scala:1693)
at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:291)
at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:459)
at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:352)
at scala.reflect.internal.Trees$class.itransform(Trees.scala:1347)
at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
这里有一些有趣的东西。从this post 我发现了关于使用 -d 标志启动 sbt 以获取调试信息。得到以下输出:
Kevins-MacBook-Pro:scala kdoherty$ sbt -d
[process_args] java_version = '1.8.0_66'
# Executing command line:
java
-Xmx2G
-Xss4M
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-Xmx384m
-Xss512k
-XX:+UseCompressedOops
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-jar
/usr/local/Cellar/sbt/0.13.9/libexec/sbt-launch.jar
所以某处我的 SBT_OPTS 设置被覆盖(默认情况下,我猜)。现在我需要找到这些默认值的来源。
【问题讨论】:
-
当你说你有相同版本的 scala-compiler.jar 和另一台可以编译它的计算机,你的意思是
scalac -version在两台计算机上返回相同的东西,或者两台计算机都有2.11.7在.sbt构建文件中定义? -
@soong:两者都在 build.sbt 文件中指定了 2.11.7。
-
@KevinDoherty 你是否知道这台计算机上安装的 java 版本,以及它的所有 JVM 设置是什么?
-
@soong 我的另一台 Mac(13 英寸 MBP)将成功编译项目,它使用的是 Java 1.8.0-b132。没有使用特殊的 JVM 设置,只使用默认设置。
-
它们看起来并没有被覆盖,而是被复制了! (我看到两个内存属性都被列出了两次,但值不同)