如何解决在 Ammonite (scala) 中重新导入脚本
我可以使用 import $file.MyScript,MyScript._
在 Ammonite 中导入脚本的方法/变量。第一次运行良好,但如果我想导入更新版本的 MyScript.sc
怎么办?
文档建议做
@ repl.sess.load()
它初始化 REPL,允许我再次导入脚本。听起来不错,但是,当我再次导入脚本时,我会得到一个 java.lang.NoClassDefFoundError
- 请参阅下面的示例会话。
repl.sess.load()
在这里可能不是正确的功能,但是如何在更新后重新导入脚本?
我知道有一个功能可以在使用带 --watch
参数的 Ammonite 脚本进行更改后重新运行脚本,但这不是使用 REPL,因此这不是一个好的解决方法。
示例会话
// As per docs: "If you want to re-load a script,you should use Ammonite's Save/Load Session functionality to
// sess.save() the session before importing the script,and sess.load()ing to reset the script
// before re-importing it."
@ repl.sess.save()
@ import $file.MyScript,MyScript._
Compiling /File/Path/MyScript.sc
import $file.$,MyScript._
@ myWord
res2: String = "mountain"
@ surroundWord(myWord)
res3: String = "barwordfoo"
@ repl.sess.load()
res4: ammonite.repl.api.SessionChanged = SessionChanged(
HashSet(
Symbol(notify),Symbol(prefixWord),Symbol(wait),Symbol(equals),Symbol(asInstanceOf),Symbol(synchronized),Symbol(notifyAll),Symbol(isinstanceOf),Symbol(!=),Symbol(res2),Symbol(ne),Symbol(hashCode),Symbol(surroundWord),Symbol(myWord),Symbol(res3),Symbol(==),...
@ myWord
cmd5.sc:1: not found: value myWord
val res5 = myWord
^
Compilation Failed
@ import $file.MyScript,MyScript._
import $file.$,MyScript._
@ myWord
java.lang.NoClassDefFoundError: ammonite/$sess/MyScript$
ammonite.$sess.cmd6$.<clinit>(cmd6.sc:1)
java.lang.classNotFoundException: ammonite.$sess.MyScript$
java.net.urlclassloader.findClass(urlclassloader.java:435)
ammonite.runtime.SpecialClassLoader.findClass(ClassLoaders.scala:241)
java.lang.classLoader.loadClass(ClassLoader.java:589)
java.lang.classLoader.loadClass(ClassLoader.java:522)
ammonite.$sess.cmd6$.<clinit>(cmd6.sc:1)
解决方法
认为这是一个问题,我提出了 here。
我也知道有一些替代功能几乎可以实现相同的结果并且运行良好。使用
amm --watch --predef MyScript.sc
这将启动 Ammonite REPL,当我退出 REPL 时,predef
参数会加载脚本,而 watch
参数会重新加载带有任何已保存更改的脚本。
所以我的典型工作流程是
- 开始编写文件中的一些方法
- 启动 REPL 并查看代码以试验新内容
- 将这些内容添加到文件中
- 重新加载脚本以检查一切是否按预期运行
- 返回 2。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。