当前位置: 首页 > 知识库问答 >
问题:

为什么sbt编译在StackOverflowerr中失败?

别俊誉
2023-03-14

我正在从事一个Scala项目,该项目已经存在了几年,但对我来说是新的。我的任务是从Scala 2.9升级它。3至2.11。7及其依赖项。我已经克服了错误和警告,但我无法在SBT中成功编译项目。我总是在几乎相同的地方收到StackOverflower错误。stacktrace看起来像这样,但细节随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 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_托管目录。scala编译器的版本。jar与在至少一台不能成功“sbt编译”代码的机器上使用的jar相同。我重新安装了sbt(通过brew删除sbt,手动删除~/.sbt目录,然后brew安装sbt)。

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

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

[添加…]作为一个实验,我从https://github.com/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)

这里有一些有趣的事情。从这篇文章中,我了解到了如何使用a-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_选项设置在某个地方被覆盖了(我猜是默认设置)。现在我需要找到这些默认值的来源。

共有3个答案

苏选
2023-03-14

我刚刚在Intellij sbt属性中添加了-Xss,问题已经解决。

Intellij SBT属性

邵宜年
2023-03-14

添加到/usr/local/etc/sbtopts的底部

-J-Xmx4G 
-J-Xss4M

准备就绪。

南门星河
2023-03-14

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

-J-Xmx2G
-J-Xss2M 

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

我希望有人觉得这有用。

 类似资料:
  • 在unix shell中尝试以下操作: https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/precompiled-2_8_2/0.13.7/jars/precompiled-2_8_2.jar https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/prec

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法:

  • 问题内容: 我正在尝试使用泛型实现以下结构。收到编译器错误,无法找出原因。 这个想法是译者使用T作为字典中键的类型。例如,可以是字符串或枚举。子类提供具体的字典。 但是它失败,因为:“类型’String’不符合协议’Hashable’” 但是String符合Hashable。它也不适用于Int,后者也符合Hashable。 如果删除类型约束,则仅用于测试(在此我还必须禁用字典,因为我不能在其中使用

  • 我有一个简单的测试设置,如 但当我尝试编译测试时,我会遇到53个错误,比如 实际上并没有传达任何关于问题所在的有用信息。我只能假设在我的构建中没有正确配置某些内容。sbt文件或其他地方。 这段代码确实曾经工作过,在我清理东西的过程中,事情发生了变化,现在它被破坏了,没有好的诊断。 有人能提出要找的东西吗?

  • 问题内容: 如果您有这样的程序: 注意两个输出语句之间写的URL 。 为什么程序编译时没有任何错误? 问题答案: 程序编译没有错误的原因是程序将其视为标签,这在Java中是允许的,并且通常与循环一起使用。 第二部分是,是的注释,因此被编译器忽略。 因此,它可以正确编译。