Scala - sbt:在运行时编译安全吗?

Scala - sbt: Is it safe to compile while running?

我经常要在scala中运行一些耗时的实验,通常我会运行第二个sbt 我对在另一个实例中运行的代码进行更改并编译的同一项目的实例。 我这样做的原因是,在我的代码取得进展之前,我不必等待长时间运行的进程完成。

我的问题是:这样做是否安全,或者是否有可能在 sbt/scala 中重新编译当前运行的部分代码会导致我的运行过程出现问题?

到目前为止我观察到的是大部分时间都很好,但是我在运行时重构我的代码时确实遇到了一次 class 未定义的错误。

正如@marcus 所提到的,编译器编写的 .class 文件尚未被您的 运行ning JVM 加载,因此有可能被加载并且与其他编译的文件不匹配 classes。在许多情况下你会没事的,但它可能会导致问题。在这种情况下,您可以做一些事情:

  1. 在单独的目录中编译。将您的代码签出到两个完全不同的目录中,并从存储库的一个副本到另一个副本进行本地提交(假设您正在使用 git)到 push/pull。这将确保您的测试在您准备好之前不会获得编译更改(当您从开发存储库 "pull" 时)。
  2. 使用像 Jenkins 或 Travis 这样的自动化 CI 系统来 运行 您对每次提交的测试。与 #1 类似,这不会与您的开发工作发生冲突,因为它是代码的单独签出。
  3. 使用 sbt-revolver,它 运行 使用 re-start 命令将程序放在单独的 JVM 中,并在有更改时重新启动它。但是,这会中断您的测试。
  4. 使用 JRebel,它在重新加载 classes 方面比 JVM 或大多数 IDE 做得更好。