加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在编译期间SBT中的StackOverflowError

发布时间:2020-12-16 09:20:09 所属栏目:安全 来源:网络整理
导读:我正在一个已经存在了几年的Scala项目,但对我而言是新的.我的任务是将其从Scala 2.9.3升级到2.11.7,并将其依赖.我已经经历了错误和警告,但是我无法使项目在SBT中成功编译.我总是在几乎相同的地方得到一个StackOverflowError.堆栈跟踪看起来像这样,但细节因Xs
我正在一个已经存在了几年的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)

SBT_OPTS如下所示:

-Xmx2G -Xss4M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

我可以在Intellij中成功完成项目,其他人可以从GitHub中提取更改,并在sbt中编译项目,所以这个问题似乎在本机上(最近有一个16GB内存的四核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删除sbt,手动删除?/ .sbt目录,然后brew install sbt).

发生错误时,我没有试图隔离正在编译的源代码行.我认为在某个地方查找配置问题或依赖冲突会更有效率.

任何进一步疑难解答的建议将不胜感激.

[添加…]可能有帮助的是,作为一个实验,我从https://github.com/scala/scala下载了Scala语言源代码,并得到以下非常类似的错误,试图对它进行编译:

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设置被覆盖(默认情况下,我猜).现在我需要找到这些默认来自哪里.

解决方法

我想到了.一旦我知道-d标志会告诉我SBT实际使用的是什么设置,我看到我的SBT_OPTS环境变量中的值被其他较低的设置所覆盖.那些来自哪里?从我的JAVA_OPTS env变量!我应该早点注意到他们,但是现在我知道我可以保留这些Java选项,并通过将SBT特定的设置添加到我/usr/local / etc / sbtopts文件中,使用稍微尴尬的格式

-J-Xmx2G
-J-Xss2M

使用显示的值我能够在我的项目上成功运行sbt编译.

我希望有人觉得这很有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读