2015-12-16 227 views
20

我正在開發一個已經存在了幾年但對我而言是新生的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被覆蓋(由違約,我猜)。現在我需要找到那些默認值來自哪裏。

+0

當你說你有相同版本的scala編譯器。jar作爲另一臺可以編譯的計算機,你的意思是'scalac -version'在兩臺計算機上都返回相同的結果,或者兩臺計算機都有.sbt構建文件中定義的2.11.7? – childofsoong

+0

@soong:都在build.sbt文件中指定了2.11.7。 –

+0

@KevinDoherty你碰巧知道在其他計算機上安裝的java版本,以及它的所有JVM設置是什麼? – childofsoong

回答

16

我想通了。一旦我知道-d標誌會告訴我SBT實際使用的設置,我發現SBT_OPTS環境變量中的值被其他較低的設置破壞了。那些來自哪裏?從我的JAVA_OPTS環境變量!我應該更早地注意到它們,但現在我知道我可以保留這些Java選項,並通過將特定於SBT的設置添加到我的/ usr/local/etc/sbtopts文件中來覆蓋它們,使用稍微尷尬的格式

-J-Xmx2G 
-J-Xss2M 

使用顯示的值,我能夠在我的項目成功運行sbt compile

我希望有人認爲這有用。

+0

如果我運行:sbt -Pyarn -pHadoop 2.7程序集-J-Xss2M我得到: Java HotSpot(TM)客戶機VM警告:忽略選項MaxPermSize = 256m;在8.0中刪除支持wa - 任何想法? – cs0815

+0

升級並警告消失。 –

相關問題