Scala sbt控制台 - 代码更改未在sbt控制台中反映

43

我使用Scala SBT控制台测试我的方法。(命令:sbt然后console)但是在Eclipse或其他外部编辑器中进行的代码更改不会反映在SBT控制台中。

每次都必须退出控制台(使用Crt + D),然后再使用console命令重新启动控制台才能看到更改。

有人遇到这个问题吗? 是否有任何方式从控制台重新加载代码?

我正在使用Ubuntu 64位操作系统,

2个回答

35

如果不使用类似JRebel这样的东西,大多数情况下是无法做到的,因为类定义可能会被破坏,导致已加载的实例无法使用。我唯一的建议是使用~console运行控制台,这样如果有更改,它们将被重新编译并重新进入控制台。

此外,如果您经常运行一组命令,则initialCommands sbt设置可以配置在启动控制台后立即运行的命令。


使用sbt 0.13版本时,控制台不会自动重启。更奇怪的是,当我使用exit退出控制台后,它会重新编译并重新进入控制台。 - Mikaël Mayer
1
添加波浪号只会在源代码更改时运行任何命令,但在“控制台”的情况下,它仍然会一直运行,直到您退出它。 - Sean Parsons

20

一个选项是在控制台中使用 :restart - 这将重新加载并重放您输入的所有命令。

对于更好的解决方案,您可能希望阅读我的博客文章关于使用JRebel和Scala进行增量开发。

您应该像这样修改sbt启动脚本:

#!/bin/bash

java -noverify -javaagent:/home/username/path/to/jrebel/jrebel/jrebel.jar
 -Drebel.lift_plugin=true -XX:+CMSClassUnloadingEnabled
 -XX:MaxPermSize=512m -Xmx512M -Xss2M -jar `dirname $0`/sbt-launch.jar
 "$@"

当你从SBT中启动REPL时,例如使用以下命令:

sbt console

导入的类发生更改后,无需执行:replayrestart REPL即可自动反映出更改——这类似于交互式Lisp编程。


谢谢,这也有所帮助。但是我们现在不使用jrebel。 - Karthik Chandraraj
1
由于它是免费的Scala开发工具,您可以考虑使用它。 - Bozhidar Batsov
2
请注意,博客文章需要在后台进行Maven持续编译。如果您没有使用Maven,您可以打开第二个SBT进程并使用SBT持续编译:~; compile - Bluu
1
不要修改启动脚本,你可以在全局SBT配置文件~/.sbtconfig中导出SBT_OPTS - chb
在原始的sbt中没有“:restart”命令。这需要JRebel或其他什么吗? - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接