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



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

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

到目前为止,我观察到的是,

大多数时候它都很好,但是在运行时重构代码时,我确实遇到了一次未定义的类错误。

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

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

最新更新