www org scala sbt

scala - org - ¿Por qué falla la compilación sbt con StackOverflowError?



scala sbt install windows (2)

Estoy trabajando en un proyecto Scala que ha existido durante algunos años pero es nuevo para mí. Mi tarea es actualizarlo de Scala 2.9.3 a 2.11.7, junto con sus dependencias. He superado los errores y advertencias, pero no puedo hacer que el proyecto se compile correctamente en SBT. Siempre obtengo un StackOverflowError en casi el mismo lugar. El stacktrace se ve así, pero los detalles varían con la configuración de Xss (actualmente 4M, pero han intentado hasta 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 tiene este aspecto:

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

Puedo "hacer" el proyecto con éxito en Intellij, y otros pueden extraer mis cambios de GitHub y compilar el proyecto en sbt, por lo que el problema parece ser local para mi máquina (un Macbook Pro de cuatro núcleos reciente con 16GB de RAM). Otros proyectos de Scala / sbt se compilan correctamente para mí en esta máquina.

Aquí hay otros detalles relevantes:

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)

He reconstruido completamente el caché de ivy2 y borré el directorio lib_managed. La versión de scala-compiler.jar es la misma que se usa en al menos una máquina que puede ''sbt compilar'' el código con éxito. Hice una reinstalación limpia de sbt (a través de brew remove sbt , eliminación manual del directorio ~ / .sbt, luego brew install sbt ).

No he intentado aislar la línea de código fuente que se está compilando cuando se produce el error. He asumido que sería más productivo buscar un problema de configuración o un conflicto de dependencia en algún lugar.

Cualquier sugerencia para la solución de problemas adicionales será apreciada.

[Agregado ...] Puede ser útil agregar que, como experimento, descargué el código fuente del idioma de Scala desde https://github.com/scala/scala y obtuve el siguiente error muy similar al sbt compile con 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)

Aquí hay algo interesante. A partir de este post , descubrí el lanzamiento de sbt con una marca -d para la información de depuración. Obtuvo la siguiente salida:

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

Entonces, en algún lugar, mis configuraciones SBT_OPTS se están anulando (por defecto, supongo). Ahora necesito encontrar de dónde vienen esos valores predeterminados.


Descubrí que la configuración SBT_OPT en el archivo bin / sbt de mi instalación sbt estaba afectando los valores de memoria establecidos en mis proyectos build.sbt

actualizar el valor existente de -Xss en este archivo de 1M a 8M elevó el tamaño de la memoria de la pila de Scalac a un punto en el que dejé de obtener excepciones de en el compilador invocado por sbt. Esto pareció extraño porque el enfoque documentado de sbt para establecer el tamaño de pila en el compilador es hacer esto con la configuración de -J-Xss.

Sbt no parece permitirte configurar la memoria de pila del compilador. Mientras que build.sbt acepta la siguiente configuración como una configuración válida, no parece aplicar el valor en el compilador:

scalacOptions en ThisBuild ++ = Seq (-J-Xss8M)

Sospecho que es un error o una funcionalidad no implementada.


Me lo imaginé. Una vez que supe que la marca -d me diría qué configuraciones estaba utilizando realmente SBT, vi que otras configuraciones inferiores estaban superando los valores de mi variable de entorno SBT_OPTS. ¿De dónde venían esos? De mi variable env JAVA_OPTS! Debería haberlos notado antes, pero ahora sé que puedo mantener esas opciones de Java como están y anularlas agregando la configuración específica de SBT a mi archivo / usr / local / etc / sbtopts, usando el formato un tanto torpe de

-J-Xmx2G -J-Xss2M

Usando los valores mostrados, pude ejecutar sbt compile éxito en mi proyecto.

Espero que alguien encuentre esto útil.