【问题标题】:Could not locate clojure/data/json: How do I get my REPL to see this (and similar) dependencies找不到 clojure/data/json:如何让我的 REPL 看到这个(和类似的)依赖项
【发布时间】:2019-06-09 02:08:37
【问题描述】:

我正在使用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。我不知道我是否忽略了任何事情,所以您的帮助将不胜感激。

【问题讨论】:

    标签: clojure jvm leiningen


    【解决方案1】:

    我在没有项目的情况下使用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 一起提供——它是一个单独的依赖项,必须获取并添加到您的类路径中才能使用它。类路径告诉 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 会读取该文件,在必要时解析依赖关系,并相应地构建类路径。

    【讨论】:

    • 非常感谢您的解释!我以为 lein repl 会解决这个问题,但你说的很有道理。我会这样做的。
    【解决方案2】:

    这是使用lein try 的绝佳机会。将其添加到 ~/.lein/profiles.clj 后,您只需运行:lein try org.clojure/data.json,您就会看到一个正在运行的 REPL,该依赖项只需一个要求即可。

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 2012-04-06
      • 2014-09-27
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多