找不到 clojure/data/json:如何让我的 REPL 看到这个(和类似的)依赖项

Could not locate clojure/data/json: How do I get my REPL to see this (and similar) dependencies

我正在使用 lein repl without a project 所以没有 project.clj.

我是 运行 Leiningen 2.8.1 on Java 1.8.0_191 OpenJDK 64 位服务器虚拟机。

当我需要一个 Clojure 依赖项时,我认为它应该可以正常工作 - 比如 clojure.data.json - 我注意到它不在我的 .m2 directory 中。这就是我得到 FileNotFoundException Could not locate clojure/data/json__init.class or clojure/data/js on.clj on classpath 的原因吗?我在那里也找不到我的其他 Clojure 依赖项,所以我不知道它们位于何处,也不知道该依赖项是否应该在 .m2 中。

我理解错误消息,但不知道它的位置,甚至不知道如何将它正确添加到 CLASSPATH 以便 REPL 看到它,我仍然卡住了。

这是我还需要安装的依赖项吗?如果是这样,我如何在不通过项目的情况下安装它?

我不了解 JVM,因为我是新手,所以请在您的回答中添加一些额外的信息。


我看过this, this, this, this and this。我不知道我是否忽略了什么,所以非常感谢您的帮助。

I am using lein run without a project so there is no project.clj.

如果您使用的是 Leiningen,那么如果您创建一个 project.clj 文件来声明您的依赖关系,这会容易得多。 Leiningen 将读取 project.clj 并处理将任何缺失的依赖项提取到您的本地 Maven 存储库,并在您启动 REPL/application 时将它们添加到您的 classpath . (lein run 在没有 project.clj 的目录中对我不起作用;我得到一个错误:No :main namespace specified in project.clj.。你是说 lein repl 吗?)

When I require a Clojure dependency that I assume should just work - like clojure.data.json - I notice that it is not in my .m2 directory.

clojure.data.json 不随 Clojure 一起提供 — 它是一个单独的依赖项,必须获取并添加到您的 class 路径才能使用它。 class 路径告诉 JVM 在加载 class 文件时去哪里查找。如果您在 project.clj:

中声明依赖关系,Leiningen 将为您完成这两件事
:dependencies [[org.clojure/clojure "1.10.0"]
               [org.clojure/data.json "0.2.6"]]

如果只想获取依赖项,也可以使用 lein deps 命令。

您可以使用 lein new project_name_goes_here 创建一个 new/blank Leiningen 项目。它将有一个带有一些样板条目的 project.clj 和一个可以声明依赖项的 :dependencies 键。

I understand the error message but without knowing its location or even knowing how to properly add it to the CLASSPATH for the REPL to see it, I remain stuck. Is this a dependency that I still need to install? If so, how do I install it without going through a project?

您可以从 Internet 手动下载它,然后手动将其路径添加到您的 class 路径,但如果您已经在使用 Leiningen,则将一行添加到 project.clj 会更容易文件并让 Leiningen 为您处理。

如果使用 project.clj 文件 w/Leiningen 不是一个选项,还有其他方法可以使用 Clojure 并在运行时解析 dependencies/build 一个 class 路径。 Boot accommodates this workflow, you can use Leiningen like this with a little added effort, as well as the newer tools.deps tooling. There are examples of each in this ClojureVerse thread,但请注意,其中一些方法的作用与在文件中声明依赖关系本质上是相同的——而不是将它们声明为 CLI 参数。

例如,使用Clojure CLI工具:

$ clj -Sdeps "{:deps {org.clojure/data.json {:mvn/version \"0.2.6\"}}}"
Clojure 1.9.0
user=> (require '[clojure.data.json :as json])
nil
user=> (json/write-str {:foo "bar"})
"{\"foo\":\"bar\"}"
user=> (System/getProperty "java.class.path")
"src:
/Users/me/.m2/repository/org/clojure/clojure/1.9.0/clojure-1.9.0.jar:
/Users/me/.m2/repository/org/clojure/data.json/0.2.6/data.json-0.2.6.jar:
/Users/me/.m2/repository/org/clojure/spec.alpha/0.1.143/spec.alpha-0.1.143.jar:
/Users/me/.m2/repository/org/clojure/core.specs.alpha/0.1.24/core.specs.alpha-0.1.24.jar"

您可以在同一目录中创建一个包含 {:deps {org.clojure/data.json {:mvn/version \"0.2.6\"}}} 的 deps.edn 文件,clj 会读取该文件,必要时解决依赖关系,然后构建 class相应的路径。

这是使用 lein try 的绝佳机会。一旦你将它添加到你的 ~/.lein/profiles.clj,你只需 运行: lein try org.clojure/data.json 并且你会看到一个 运行ning REPL 与那个依赖只是一个需求。