【问题标题】:How to require a jar file in Clojure REPL?如何在 Clojure REPL 中需要一个 jar 文件?
【发布时间】:2012-11-05 05:50:28
【问题描述】:

很容易require一个来自clojure的包:

user=> (require 'clojure.core)
nil

但是我如何在 Clojure 中要求 .jar 文件?

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

【问题讨论】:

标签: java clojure


【解决方案1】:

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

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

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

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

【讨论】:

  • 我是否必须做一些特别的事情才能让 lein2 注意到新的依赖关系?
  • 这取决于您如何定义 "something special" :) 您应该在 clojarsmaven repo 中找到依赖项并将其添加到 project.clj leiningen.org 的第一个示例显示 :dependencies 部分供您参考。
【解决方案2】:

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

【讨论】:

  • 那么如何使用 JAR 启动 Clojure REPL?由于我用谷歌搜索,我只发现java 命令有这个选项。 Clojure 有替代品吗?
  • 你将jar作为依赖添加到project.clj中
  • 所以,你的意思是 lein 是唯一的解决方案。
  • @Alex Baranosky:您可以在运行时从 REPL 动态添加 jar,就像您可以在运行时将 jar 动态添加到正在运行的 Java 程序中一样。然而,这可能比它的价值更麻烦:我建议改用 Leiningen。但仍然......这可以做到:我已经重用(来自 Clojure)来自 Java 项目的引导代码,该项目通过动态地将 jars 添加到类路径来解决运行时的依赖关系,并且它在 REPL 中运行良好:)
  • lein 不是唯一的解决方案。但是,对于 Clojure 来说,这是最简单的。
【解决方案3】:

看看Pomegranate 库。

【讨论】:

    【解决方案4】:

    所以,在 Ubuntu 14.04 上检查 man clojure 的 REPL 让我选择了 -cp 选项(-classpath 的缩写):

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

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

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

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

    下载data.csv.jar关注the link from the READMEhttp://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=> 
    

    【讨论】:

      【解决方案5】:

      你可以使用这个solution

      在回复中:

      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])
      

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 2013-09-04
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多