在 Ammonite (scala) 中重新导入脚本
Posted
技术标签:
【中文标题】在 Ammonite (scala) 中重新导入脚本【英文标题】:Re-import a script in Ammonite (scala) 【发布时间】:2021-05-23 04:31:45 【问题描述】:我可以使用 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)
【问题讨论】:
【参考方案1】:认为这是一个问题,我提出了here。
我还了解到,有一些替代功能几乎可以实现相同的结果并且运行良好。使用
amm --watch --predef MyScript.sc
这会启动 Ammonite REPL,predef
参数会加载脚本,watch
参数会在我退出 REPL 时重新加载脚本并保存所有更改。
所以我的典型工作流程是
-
开始在文件中编写一些方法的脚本
启动 REPL 并打开代码来试验新的东西
将这些内容添加到文件中
重新加载脚本以检查一切是否按预期运行
回到 2。
【讨论】:
以上是关于在 Ammonite (scala) 中重新导入脚本的主要内容,如果未能解决你的问题,请参考以下文章
Ammonite: Script ... 不接受参数(在 OS X 下)
如何判断我是在 Ammonite repl 下运行还是在脚本中运行?