Java 如何在Clojure REPL中需要jar文件?
很容易Java 如何在Clojure REPL中需要jar文件?,java,clojure,Java,Clojure,很容易要求clojure提供一个包: user=> (require 'clojure.core) nil 但是我如何在Clojure中需要.jar文件呢 (我正在努力学习lein。Leiningen对大型项目而不是小型脚本很有用。因此,我想知道在Clojure脚本和回复中使用jar包的最佳方法是什么。)我不认为你可以。REPL必须使用类路径上的JAR启动。请查看库。虽然可以在库的帮助下在运行时将JAR添加到应用程序中,但非常不鼓励: 它从外部隐藏依赖项,最终用户不会知道他们需要它来运行
要求clojure提供一个包:
user=> (require 'clojure.core)
nil
但是我如何在Clojure中需要.jar
文件呢
(我正在努力学习lein
。Leiningen对大型项目而不是小型脚本很有用。因此,我想知道在Clojure脚本和回复中使用jar
包的最佳方法是什么。)我不认为你可以。REPL必须使用类路径上的JAR启动。请查看库。虽然可以在库的帮助下在运行时将JAR添加到应用程序中,但非常不鼓励:
它从外部隐藏依赖项,最终用户不会知道他们需要它来运行代码
jar本身可以依赖于其他jar文件(因此会给最终用户带来解决问题的压力)
我想我是在重复其他受访者的观点,但我想我应该补充几点来验证他们的建议
事实上,lein2在封面下使用了石榴,只是为了在需要依赖项后不必重新启动REPL。它仅用于开发目的。您可以使用它
答复:
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])
因此,在Ubuntu 14.04上检查我的REPL的manclojure
使我进入了-cp
选项(它是-classpath
的缩写):
事实上,作为参考,我想分享一个使用jar
库的示例。因为它可能对不熟悉Java(和所有机器)的人有用,但希望使用这个漂亮的lisp编写脚本/编写简短的漂亮的小程序,因此不需要leiningen
例如:您希望解析一些包含CSV内容的文件,并以某种方式使用它
- 文件系统上的文件使用标准的
clojure.java.io
- CSV内容由外部文件解析
下载data.csv.jar
以下内容:
将其放在当前工作目录中,然后打开REPL,将路径添加到类路径中
:
clojure -cp ./path/to/package.jar
user=> (require `clojure.package)
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=>
那么如何用JAR启动Clojure REPL呢?由于我在谷歌上搜索,我发现只有java
命令有这个选项。Clojure中是否有替换项?您将jar作为依赖项添加到project.cljSo中,您的意思是lein是唯一的解决方案。@Alex Baranosky:您可以在运行时从REPL动态添加jar,就像您可以在运行时将jar动态添加到运行中的Java程序一样。然而,这可能比它的价值更麻烦:我建议改用Leiningen。但还是。。。这是可以做到的:我重用了(来自Clojure)一个Java项目的引导代码,该项目通过向类路径动态添加JAR来解决运行时的依赖关系,并且在REPL:)中运行良好。lein不是唯一的解决方案。但是,这对于Clojure来说是最简单的。您可能应该使用leinginen来设置类路径和依赖项。这应该可以解决99%的问题和烦恼。请看我是否必须做一些特殊的事情才能让lein2注意到新的依赖项?这取决于您如何定义“特殊的东西”:)您应该在或中找到依赖项并将其添加到project.clj。第一个示例显示:dependencies部分供您参考。