2015-12-16 13 views
20

私は数年前に存在していたScalaプロジェクトに取り組んでいますが、私にとっては新しくなっています。私の仕事は、Scala 2.9.3から2.11.7へ、その依存関係をアップグレードすることです。私はエラーと警告を過ぎてしまったが、私はSBTでプロジェクトを正常にコンパイルすることができない。私はいつも同じ場所でStackOverflowErrorを取得します。スタックトレースは次のようになりますが、詳細は、XSSの設定(現在は4Mが、24Mと高くしようとしている)で異なりますStackOverflowErrorでsbtコンパイルが失敗するのはなぜですか?

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のバージョンは、コードを正常にコンパイルできる1台以上のマシンで使用されているものと同じです。私は、brew remove sbt経由で、〜/ .sbtディレクトリを手動で削除してから、brew install sbtを使って、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を起動する方法を知りました。だから、どこかで私のSBT_OPTSの設定が上書きされている

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 

は、(デフォルトで、私は推測する):次の出力を得ました。今私はそれらのデフォルトがどこから来ているのかを知る必要があります。

+0

同じバージョンのスカラーコンパイラを使用しているとします。'scalac -version'が両方のコンピュータで同じことを返すか、両方のコンピュータが.sbtビルドファイルで定義された2.11.7を持っていることを意味しますか? – childofsoong

+0

@soong:どちらもbuild.sbtファイルで2.11.7が指定されています。 –

+0

@KevinDohertyこの他のコンピュータにインストールされているjavaのバージョンを知っていますか?そのJVMの設定は何ですか? – childofsoong

答えて

16

私はそれを理解しました。 SBTが実際に使用していた設定が-dフラグによってわかると、私はSBT_OPTS環境変数の値が他のより低い設定値によって狂っているのを見ました。それらはどこから来たのですか?私のJAVA_OPTSのenv変数から!私はそれらをもっと早く気づいていたはずですが、今ではJavaのオプションをそのまま使用して、をSBT固有の設定を私の/ usr/local/etc/sbtoptsファイルに追加することでオーバーライドできます。

私は私のプロジェクトで正常に sbt compileを実行することができた示された値を使用して
-J-Xmx2G 
-J-Xss2M 

誰かがこの点を知りたがっていれば幸いです。

+0

これを実行すると、sbt -Pyarn -pHadoop 2.7アセンブリ-J-Xss2Mが表示されます。 Java HotSpot(TM)クライアントVM警告:無視オプションMaxPermSize = 256m;サポートwa sは8.0で削除 - 任意のアイデア? – cs0815

+0

sbtをアップグレードすると警告が消えます。 –

関連する問題