首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ammonite (scala)中重新导入脚本

在Ammonite (scala)中重新导入脚本
EN

Stack Overflow用户
提问于 2021-02-20 17:54:38
回答 1查看 169关注 0票数 1

我可以使用import $file.MyScript, MyScript._在Ammonite中导入脚本的方法/变量。它第一次工作得很好,但是如果我想导入MyScript.sc的更新版本怎么办

文档建议去做

代码语言:javascript
复制
@ repl.sess.load()

它初始化REPL,允许我再次导入脚本。听起来不错,但是,当我再次导入脚本时,我会得到一个java.lang.NoClassDefFoundError --请参见下面的示例会话。

repl.sess.load()在这里可能不是正确的功能,但我如何在更新脚本后重新导入它?

我知道有一种功能可以在使用带有--watch参数的Ammonite脚本进行更改后重新运行脚本,但这不是使用REPL,所以它不是一个很好的变通方法。

示例会话

代码语言:javascript
复制
// 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)
EN

回答 1

Stack Overflow用户

发布于 2021-03-30 01:38:04

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

我还了解到,有一些替代功能几乎可以达到同样的效果,而且效果很好。使用

代码语言:javascript
复制
amm --watch --predef MyScript.sc

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

所以我的典型工作流程是

  1. 开始编写脚本文件中的几个方法
  2. 启动REPL并查看代码以试验新内容
  3. 将该内容添加到文件
  4. 重新加载脚本以检查一切是否按预期运行

<代码>H113返回到2。<代码>H214<代码>G215

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66290176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档