使用 Clojars 中的 Java 库的 "require" 语句

What "require" statement to use Java library from Clojars

大多数 Clojure 库不仅提供有关将什么放入 project.clj 文件的信息,还提供如何 require 源文件中的库的信息。例如,https://github.com/clojure/data.json 提供了一个 Usage 部分:

(ns example
  (:require [clojure.data.json :as json]))

我想使用 Clojars 库(它是一个 Java 库),它在 Clojars 上列出:https://clojars.org/zololabs/jericho-html-parser。我已成功将依赖项添加到我的 project.clj 文件中,但我不知道如何 require 它。

我尝试了 (require '[zololabs.jericho-html-parser]) 和许多变体,但 none 似乎有效。我查看了我知道如何要求的库的命名约定,以查看是否可以辨别模式,但我没有成功。

有没有一种直接的方法可以根据文件名、莱宁根坐标或其他信息告诉我们如何require图书馆?

您刚刚发现了 Clojure 中的一个不一致之处。

简短的回答是您缺少一个冒号,这是源文件中使用的 (ns ...) 形式所必需的:

(ns example
  (:require [clojure.data.json :as json]))

请注意,由于 ns 是一个宏,源文件版本不需要在左方括号前使用单引号。

另一种情况是在 REPL 中使用 (require ...) 函数 。在这种情况下,您需要语法:

> (require '[clojure.data.json :as json])

其中 > 是 REPL 提示符。在这种情况下,您正在调用 函数 ,因此 require 之前没有冒号。但是,由于 函数 不是 ,您需要引用指定库名称及其别名的向量。

首先,您 require 不是 Clojure 的 Java 库,而是 import 一个或多个 Java 类。例如:

(:import [net.htmlparser.jericho Source TextExtractor])

然后通过 Java 互操作使用那些 类。例如

(Source. (java.net.URL. "https://yahoo.com"))

请注意,您不需要在类路径中导入 Java 类 即可使用它们。如果您打算使用它们一次或两次,则可以避免导入并仅通过它们的完全限定名称来引用它们:

(net.htmlparser.jericho.Source. (java.net.URL. "https://www.yahoo.com"))

显然您需要先查找 Java 库 API 并了解其工作原理。在这种特殊情况下,请参阅 here.