如何启动一个Clojure REPL,并访问一个JAR文件

8

我是新手,对Clojure不太熟悉。我有一个JAR文件想在Clojure REPL中使用,但是使用Leiningen 2失败了。

我尝试将JAR文件放在src/myjar.jar和src/org/mydomain/myjar.jar中。

当我运行lein repl时,会出现错误,指出Leiningen无法找到我的构件,并引用了一个关于可重复性的页面,我不理解。

这是我的project.clj文件(myjar的真实名称):

(defproject cljliveordead "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [org.allen.temporalintervalrelationships/time "0.2" :extension "jar"]])
3个回答

4

您可以使用lein-localrepo插件来使用本地jar包。将以下行添加到您的project.clj文件中:

:plugins [[lein-localrepo "0.4.0"]]

然后使用以下命令将jar安装到本地仓库

lein localrepo install <path-to-jar> org.allen.temporalintervalrelationships/time 0.2

您可以通过运行lein localrepo list检查文件是否已安装,并使用lein deps检查lein是否能够解析项目依赖项。如果一切正常,您可以使用lein repl开始操作jar。

由于其目标是可重复构建, Leiningen不喜欢本地jars。如果这是一个使用第三方闭源jar的真实项目,则最好的做法是将其安装在本地Nexus存储库中,并将该存储库的引用添加到您的项目中。

但是,对于您想要实现的所有内容来说,这似乎有些繁琐。如果您只想在REPL中操作jar,请创建一个简单的项目,如下所示:

(defproject clojure-time "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [com.cemerick/pomegranate "0.0.13"]])

并使用 pomegranate 库手动将 jar 添加到您的类路径中

(require '[cemerick.pomegranate :as p])
(p/add-classpath "jsr-310-ri-0.6.3.jar")
(javax.time.Instant/now)

并开始玩耍。


1

我在很多应用程序中使用clojure-csv,因此请确保引用clojure-csv的模块能够与其一起构建,这是我所做的:

0)运行lein new bene-csv

1)在project.clj中添加以下内容(在输入lein new bene-csv之后)。相关的一行是[clojure-csv/clojure-csv "1.3.2"],但为了举例说明,展示整个project.clj也是有意义的。

(defproject bene-csv "1.0.4-SNAPSHOT"
  :description "A csv parsing library"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [clojure-csv/clojure-csv "1.3.2"]
                 [util "1.0.2-SNAPSHOT"]]


  :aot [bene-csv.core]
  :omit-source true)

2) 确保我的bene-csv/src/bene_csv/core.clj引用了clojure-csv。

(ns bene-csv.core
  ^{:author "Charles M. Norton",
    :doc "bene-csv is a small library to parse a .csv file.
        Created on March 8, 2012"}
  (:require [clojure.string :as cstr])
  (:require [util.core :as utl])
  (:use clojure-csv.core))

最后,我运行了这些命令,以便我的主项目可以引用bene-csv的函数和定义。
lein deps
lein install

1
感谢您的帮助。我不确定这如何适用于我的情况,因为我正在尝试从lein repl使用原始的Java jar而不是导入Clojure库。 - Lyn Headley
我的答案倾向于根据您的问题使用链接。我相信原始的jar文件可以通过将其放在类路径上来以同样的方式导入。 - octopusgrabbus

1

粗暴的方法是将其放入/proiject/path/lib/,而“正确”的方法是:

  • 为项目添加依赖项
  • 运行lein deps,它会打印出安装jar到本地maven仓库的命令
  • 使用指向您的jar的路径运行lein给出的命令
  • 再次运行lein deps

你能澄清一下添加依赖项的步骤吗?我已经尝试在我的project.clj文件中这样做了,但没有成功。 - Lyn Headley
“/project/path/lib” 这是绝对路径吗? - Lyn Headley
这是我尝试描述主项目目录下的lib子目录。在与project.clj相同的目录中,应该有一个名为lib的子目录。 - Arthur Ulfeldt
1
感谢您的帮助。我将jar文件放置在lib/org/allen/temporalintervalrelationships/allentemporalintervalrelationshipsv02.jar中,但是lein repl仍然显示相同的错误信息。我还尝试将其放置在lib目录中。 - Lyn Headley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接