我正在開發一個已經存在了幾年但對我而言是新生的Scala項目。我的任務是將其從Scala 2.9.3升級到2.11.7及其依賴項。我已經過去了錯誤和警告,但是我無法讓項目在SBT中成功編譯。我總是在幾乎相同的地方得到一個StackOverflowError。堆棧跟蹤看起來是這樣,但具體細節與XSS設置不同(目前4M,而是試圖爲24M高):爲什麼sbt編譯失敗與StackOverflowError?
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編譯項目,所以這個問題似乎侷限於我的機器(最近有16GB RAM的四核MacBook Pro)。其他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(通過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我發現有關啓動sbt與調試信息的-d標誌。得到了以下的輸出:
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編譯器。jar作爲另一臺可以編譯的計算機,你的意思是'scalac -version'在兩臺計算機上都返回相同的結果,或者兩臺計算機都有.sbt構建文件中定義的2.11.7? – childofsoong
@soong:都在build.sbt文件中指定了2.11.7。 –
@KevinDoherty你碰巧知道在其他計算機上安裝的java版本,以及它的所有JVM設置是什麼? – childofsoong