clojure.tools/namespace刷新失败,显示"No namespace:foo"

Arn*_*eur 2 namespaces clojure

我正在使用tools.namespace在REPL上提供名称空间的智能重新加载.然而,当调用refresh或者refresh-all,它抛出一个错误.

user=> (require '[clojure.tools.namespace.repl :as tn])
user=> (tn/refresh)
:reloading (ep31.common ep31.routes ep31.config ep31.application user ep31.common-test ep31.example-test)
:error-while-loading user

java.lang.Exception: No namespace: ep31.config, compiling:(user.clj:1:1)
Run Code Online (Sandbox Code Playgroud)

并且它似乎最终处于这种奇怪的状态,其中(require ep31.config)没有错误,但之后实际上没有定义命名空间.

Arn*_*eur 6

我有点想到这一点,这似乎是一种情况的组合

  • 有AOT编译的类留在target/classes从做lein uberjar以前
  • 当加载的命名空间被AOT编译时,tools.namespace无法正常工作
  • target/classes 默认情况下是类路径

长话短说,如果你之前做了jar/ uberjarbuild,那么删除target/,事情应该重新开始工作.

我还没能解决的问题是为什么target/classes在类路径上开始.我怀疑它是由Leiningen添加的,但还没有找到它发生的地方或原因.

  • 因此,如果您在执行“ lein uberjar”之后进行了“ lein clean”处理,您会不会遇到问题?或者更确切地说,一旦您陷入问题中描述的那样的糟糕状态,便立即进行了“清洁”。 (2认同)