我正在研究一个已经存在了几年的Scala项目,但这对我来说是新的.我的任务是将它从Scala 2.9.3升级到2.11.7及其依赖项.我已经过了错误和警告,但我无法让项目在SBT中成功编译.我总是在几乎相同的地方得到一个StackOverflowError.堆栈跟踪看起来像这样,但细节因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)
Run Code Online (Sandbox Code Playgroud)
SBT_OPTS看起来像这样:
-Xmx2G -Xss4M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
Run Code Online (Sandbox Code Playgroud)
我可以在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)
Run Code Online (Sandbox Code Playgroud)
我已经完全重建了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)
Run Code Online (Sandbox Code Playgroud)
这是有趣的事情.从这篇文章中我发现有关启动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
Run Code Online (Sandbox Code Playgroud)
所以在某处我的SBT_OPTS设置被覆盖(默认情况下,我猜).现在我需要找到这些默认值的来源.
Kev*_*rty 31
我想到了.有一次,我知道了-d标志将设置什么SBT实际使用告诉我,我看到在我的SBT_OPTS环境变量的值被其他,较低的设置重挫.那些人来自哪里?从我的JAVA_OPTS env变量!我应该早点注意到它们,但现在我知道我可以按原样保留这些Java选项并通过将特定于SBT的设置添加到我的/ usr/local/etc/sbtopts文件来覆盖它们,使用有点笨拙的格式
-J-Xmx2G
-J-Xss2M
Run Code Online (Sandbox Code Playgroud)
使用显示的值,我能够sbt compile在我的项目上成功运行.
我希望有人觉得这很有用.
输出的相关部分sbt -h:
# jvm options and output control
JAVA_OPTS environment variable, if unset uses ""
.jvmopts if this file exists in the current directory, its contents
are appended to JAVA_OPTS
SBT_OPTS environment variable, if unset uses ""
.sbtopts if this file exists in the current directory, its contents
are prepended to the runner args
Run Code Online (Sandbox Code Playgroud)
.sbtopts因此,就我而言,我通过创建一个包含内容的文件解决了问题
-J-Xmx4G
-J-Xss4M
Run Code Online (Sandbox Code Playgroud)
在项目目录中。
注意:运行会sbt -d显示已使用的设置,例如:
$ sbt -d
[addSbt] arg = '-debug'
[process_args] java_version = '8'
# Executing command line:
java
-Xms1024m
-XX:ReservedCodeCacheSize=128m
-XX:MaxMetaspaceSize=256m
-Xmx2G
-Xss2M
-jar
/path/to/sbt-launch.jar
-debug
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12135 次 |
| 最近记录: |