无法找到clojure / data / json:如何获取我的REPL以查看此(和类似的)依赖项

时间:2019-01-15 03:54:50

标签: clojure jvm leiningen

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

我正在Java 1.8.0_191 OpenJDK 64位服务器VM上运行Leiningen 2.8.1。

当我需要一个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,因此我在其答案中添加了一些额外的信息。


我看过thisthisthisthisthis。我不知道我是否有什么事可做,所以您的帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

  

我在没有项目的情况下使用lein run,所以没有project.clj。

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

  

当我需要一个Clojure依赖项时,我认为它应该可以正常工作-就像clojure.data.json-我注意到它不在我的.m2目录中。

clojure.data.json不随Clojure一起提供-它是一个单独的依赖项,必须将其提取并添加到类路径中才能使用它。 classpath告诉JVM加载类文件时在哪里寻找。如果您在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创建一个新的/空白的Leiningen项目。它将具有一个project.clj,其中包含一些样板条目和一个:dependencies键,您可以在其中声明依赖项。

  

我理解错误消息,但是不知道错误消息的位置,甚至不知道如何正确地将其添加到CLASSPATH中以使REPL能够看到它,但我仍然卡住了。这是我仍然需要安装的依赖项吗?如果是这样,如何在不进行任何项目的情况下安装它?

您可以从Internet手动下载它,然后将其路径手动添加到您的类路径中,但是如果您已经在使用Leiningen,则将行添加到project.clj文件中并让Leiningen来为您轻松得多。

如果不能使用带有Leiningen的project.clj文件,则还有其他方法可以使用Clojure和解析依赖项/在运行时构建类路径。 Boot适应了这一工作流程,您可以花一点力气就可以像这样使用Leiningen,以及更新的tools.deps工具。 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会读取该文件,必要时解析依赖关系,并相应地构建类路径。

答案 1 :(得分:0)

这是使用lein try的绝佳机会。将其添加到UI中后,您只需运行:@Route(""),您就会得到运行REPL的机会,而该依赖关系是必需的。