9

require从clojure打包很容易:

user=> (require 'clojure.core)
nil

但是我怎样才能.jar在 Clojure 中需要一个文件呢?

(我正在努力学习lein。Leiningen 对大型项目而不是小型脚本很有用。所以我想弄清楚jar在我的 Clojure 脚本和 REPL 中使用包的最佳方法是什么。)

4

5 回答 5

4

尽管可以借助Pomegranate库在运行时将 jar 添加到应用程序,但强烈建议不要这样做:

  1. 它从外部隐藏了依赖关系,最终用户不会知道他们需要它来运行代码。
  2. jar 本身可以依赖于其他 jar 文件(因此会给最终用户带来压力来弄清楚)

我想我在重复其他受访者,但我想我会添加要点来验证他们的建议。

事实上,lein2 在幕后使用了 pomegranate,只是为了在需要依赖后不必重新启动 REPL。它仅用于开发目的。

于 2012-11-05T21:08:55.897 回答
3

我不认为你可以。REPL 必须使用类路径上的 JAR 启动。

于 2012-11-05T06:08:44.617 回答
1

看看石榴图书馆。

于 2012-11-05T10:10:25.083 回答
1

因此,man clojure在 Ubuntu 14.04 上检查我的 REPL 让我有了-cp选择(这是 的缩写-classpath):

clojure -cp ./path/to/package.jar
user=> (require `clojure.package)

事实上,作为参考,我想分享一个使用jar库的示例。因为它可能对不熟悉 Java(以及所有机器)但想将这个漂亮的 lisp 用于脚本/简短的小程序的人有用,因此不需要 leiningen。

示例是:您想解析一些具有 CSV 内容的文件并以某种方式使用它。

  • 文件系统上的文件使用标准访问clojure.java.io
  • CSV 内容用外部包解析data.csv

data.csv.jar按照自述文件中的链接下载:http ://search.maven.org/remotecontent?filepath=org/clojure/data.csv/0.1.4/data.csv-0.1.4.jar

将它放在您当前的工作目录中并打开 REPL 添加路径classpath

clojure -cp ./data.csv-0.1.4.jar
Clojure 1.4.0
user=> ; now you have it
user=> (require '[clojure.data.csv :as csv])
nil
user=> 
于 2017-07-22T15:10:26.673 回答
0

您可以使用此解决方案

在回复中:

user=>(def cl (-> (Thread/currentThread) (.getContextClassLoader)))
;; need load dependicies before, using the same method
user=>(-> cl (.addURL (java.net.URL. "file:///c:/Users/dev/m2/repository/cheshire/cheshire/5.3.1/cheshire-5.3.1.jar")))
user=>(require '[cheshire.core :as json])
于 2017-02-13T13:27:04.350 回答