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

Bar*_*Bar 1 scala sbt

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

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

到目前为止,我观察到的是,大多数情况下它都很好,但是在运行时重构我的代码时,我确实遇到过一次未定义的类错误。

Rei*_*cer 5

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

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