【问题标题】:Sbt build hangs on random stagesSbt 构建挂在随机阶段
【发布时间】:2018-07-08 19:44:41
【问题描述】:

我有一个多项目 sbt 构建,它挂在其执行的不同阶段(在编译一个或多个模块之后)。

如果您能就其挂起的可能原因提供任何意见,我将不胜感激。

为了给出一个上下文,这个构建包含三个模块

  • 前端:scala.js 模块
  • 后端:akka-http 中的网络服务器
  • model:models和json序列化器的共享代码

build.sbt文件:

name := "my-project"

version := "0.1"

scalaVersion := "2.12.4"

lazy val `my-project` = (project in file(".")).aggregate(backend, frontend, modelJvm, modelJs)

lazy val backend =
  (project in file("backend"))
    .dependsOn(modelJvm)
    .settings(
      libraryDependencies ++= Seq(
"com.lihaoyi" %% "upickle" % "0.5.1",
        "com.typesafe.akka" %% "akka-http" % "10.0.11"
      ),
      resourceGenerators in Compile += Def.task {
        val f1 = (fastOptJS in Compile in frontend).value
        val f2 = (packageScalaJSLauncher in Compile in frontend).value
        Seq(f1.data, f2.data)
      }.taskValue,
      watchSources ++= (watchSources in frontend).value
    )

lazy val frontend =
  (project in file("frontend"))
    .enablePlugins(ScalaJSPlugin)
    .settings(
      scalaJSUseMainModuleInitializer := true,
      libraryDependencies ++= Seq(
        "com.lihaoyi" %%% "scalatags" % "0.6.7",
        "org.scala-js" %%% "scalajs-dom" % "0.9.2"
      )
    )
    .dependsOn(modelJs)

lazy val model = (crossProject.crossType(CrossType.Pure) in file("model"))
                  .settings(
                     libraryDependencies ++= Seq(
                       "com.lihaoyi" %%% "upickle" % "0.5.1"
                     )
                  )

lazy val modelJs = model.js
lazy val modelJvm = model.jvm

plugins.sbt文件:

addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.22")

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

build.properties:

sbt.version = 1.1.0

构建过程示例:

[info] Compiling 7 Scala sources to .../backend/target/scala-2.12/classes ...
[info] Compiling 8 Scala sources to ...frontend/target/scala-2.12/classes ...
[warn] there was one deprecation warning (since 0.6.20); re-run with -deprecation for details
[warn] one warning found
[info] Done compiling.

之后 sbt 没有响应。我在任务管理器和 jvisualvm 中看到,与此构建对应的 java 进程消耗了所有分配给它的内存(Xmx 值)。

欢迎提出任何建议/意见。

【问题讨论】:

  • 您确定它实际上是在挂起,而不是仅仅需要很长时间吗?甚至在您提到 Xmx 之前,我的猜测是链接器内存不足,当链接器达到该限制时,它会真的缓慢运行。你分配了多少内存? Scala.js 可能需要相当多的良好编译/链接性能...
  • 我尝试了使用 -Xmx1G 和 -mem 3000 的多个选项。根据 libvisualvm,我在 5-10 分钟内完成了这些选项。整个项目的长度小于 30 个文件,所以我没想到会出现这种行为。

标签: scala sbt scala.js


【解决方案1】:

Scala.js 非常消耗内存,作为与编译时间的权衡。对于一个典型的项目来说,1GB 绝对不够。

我建议在启动 sbt 时至少使用-Xmx3G,如果你负担得起的话,建议使用 4G。

请注意,直接在您的项目中的源文件数量不是很优雅。您所有的传递依赖都计入使用的总内存,因为它们需要加载到内存中才能与您的项目链接在一起。

【讨论】:

  • 我确实试过了。根据 jvisualvm,所有内存都在 10 分钟内耗尽。此外,如果我为 scala.js 模块单独执行fastOptJS,它会在几秒钟内完成。
【解决方案2】:

其实这不是内存问题,而是库问题。在此构建中,upickle 库用于共享模块中的 json 序列化:

"com.lihaoyi" %%% "upickle" % "0.5.1"

根据使用情况,这个库似乎使用 来生成序列化/反序列化机制。一旦我迁移到

"com.github.benhutchison" %%% "prickle" % "1.1.13"

构建能够在几秒钟内完成而无需太多内存 - 大约 -Xmx1G。我会尽量减少示例,并将问题提交到 github。

【讨论】:

    【解决方案3】:

    将日志级别设置为调试可能会有所帮助,例如

    logLevel := Level.Debug
    

    here 所述,例如

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2021-11-06
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多