【问题标题】:How to launch a clojure repl with access to a jar如何启动一个可以访问 jar 的 clojure repl
【发布时间】:2012-06-27 06:27:11
【问题描述】:

我是 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"]])

【问题讨论】:

    标签: clojure leiningen


    【解决方案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
    

    【讨论】:

    • 感谢您的帮助。我不确定这如何适用于我的案例,因为我正在尝试使用来自 lein repl 的原始 java jar,而不是导入 clojure lib。
    • 我的回答倾向于根据您的要求使用留置权。我相信原始 jar 文件可以通过将其放在类路径中以相同的方式导入。
    【解决方案2】:

    您可以使用 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 是否可以使用lein deps 解决项目依赖关系。如果一切顺利,您可以使用 lein repl 开始使用 jar。

    Leiningen 不喜欢本地 jar,因为它的目标是 repeatable builds。如果这是一个使用第三方闭源 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)
    

    然后玩。

    【讨论】:

      【解决方案3】:

      骇人听闻的方法是将其放入/proiject/path/lib/,而“正确”的方法是:

      • 将它的依赖项添加到您的项目中
      • 运行 lein deps,它将打印将 jar 安装到本地 maven 存储库的命令
      • 运行 leiningen 为您提供 jar 路径的命令
      • 再次运行 lein deps

      【讨论】:

      • 你能澄清一下添加依赖的步骤吗?我曾尝试在我的 project.clj 中这样做,但没有运气
      • /project/path/lib 是什么路径,绝对路径?
      • 我尝试描述项目主目录下的 lib 子目录。在与您的 project.clj 相同的目录中,它们应该是一个名为 lib 的子目录
      • 感谢您的帮助。我将 jar 放在 lib/org/allen/temporalintervalrelationships/allentemporalintervalrelationshipsv02.jar 中,但 lein repl 仍然给出相同的错误消息。我也尝试将它放在 lib 目录中。
      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多