【问题标题】:Re-import a script in Ammonite (scala)在 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)

【问题讨论】:

    标签: scala scripting ammonite


    【解决方案1】:

    认为这是一个问题,我提出了here

    我还了解到,有一些替代功能几乎可以实现相同的结果并且运行良好。使用

    amm --watch --predef MyScript.sc
    

    这会启动 Ammonite REPL,predef 参数会加载脚本,watch 参数会在我退出 REPL 时重新加载脚本并保存所有更改。

    所以我的典型工作流程是

    1. 开始在文件中编写一些方法的脚本
    2. 启动 REPL 并打开代码来试验新的东西
    3. 将这些内容添加到文件中
    4. 重新加载脚本以检查一切是否按预期运行
    5. 回到 2。

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2017-11-23
      • 2017-04-29
      • 2017-10-18
      • 2017-08-24
      • 2019-08-11
      • 2018-06-08
      • 2019-03-01
      • 2013-04-05
      相关资源
      最近更新 更多