gpt4 book ai didi

scala - 为什么 sbt 编译失败并出现 StackOverflowError?

转载 作者:行者123 更新时间:2023-12-02 10:47:09 26 4
gpt4 key购买 nike

我正在开发一个 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 中编译该项目,因此问题似乎是我的机器本地问题(最近的四核 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)

我已经完全重建了ivy2缓存并清除了lib_management目录。 scala-compiler.jar 的版本与至少一台可以成功“sbt 编译”代码的机器上使用的版本相同。我彻底重新安装了 sbt(通过 brew remove sbt,手动删除 ~/.sbt 目录,然后 brew install sbt)。

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

任何有关进一步故障排除的建议将不胜感激。

[已添加...]补充一下可能会有所帮助,作为实验,我从 https://github.com/scala/scala 下载了 Scala 语言源代码。并在尝试sbt编译时遇到以下非常相似的错误:

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 环境变量中的值被其他较低的设置破坏。那些来自哪里?来 self 的 JAVA_OPTS 环境变量!我应该早点注意到它们,但现在我知道我可以保持这些 Java 选项不变,并通过将 SBT 特定设置添加到我的/usr/local/etc/sbtopts 文件来覆盖它们,使用有点尴尬的格式

-J-Xmx2G
-J-Xss2M

使用显示的值,我能够在我的项目上成功运行 sbtcompile

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

关于scala - 为什么 sbt 编译失败并出现 StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com