Clojure/Lein REPL与JLine

5

由于某种原因,我无法在jline中使用clojure REPL。我的做法是从github上git clone了clojure仓库,然后运行ant进行构建,接着我将jline-0.9.94.jar下载到和clojure.jar相同的目录下,最后运行以下命令:

java -cp jline-0.9.94.jar:clojure.jar jline.ConsoleRunner clojure.main

并获得以下错误:
    Exception in thread "main" java.lang.ClassNotFoundException: clojure.main
 at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:317)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
 at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:375)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Class.java:164)
 at jline.ConsoleRunner.main(Unknown Source)

这是我当前目录中的文件:

vvshs-macbook-2:clojure vvsh$ ls
build.xml                                 clojure-sources-1.2.0-master-SNAPSHOT.jar epl-v10.html                              src
classes                                   clojure-sources.jar                       jline-0.9.94.jar                          test
clojure-1.2.0-master-SNAPSHOT.jar         clojure.iml                               pom-template.xml
clojure-slim-1.2.0-master-SNAPSHOT.jar    clojure.jar                               pom.xml
clojure-slim.jar                          doc                                       readme.txt
vvshs-macbook-2:clojure vvsh$ 

我在clojure 1.1和lein repl上遇到了同样的错误(看起来lein维护自己的clojure版本)。

顺便说一句,这是在Mac OS X 10.5.8上出现的。

java version "1.5.0_24"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_24-b02-357-9M3165)
Java HotSpot(TM) Client VM (build 1.5.0_24-149, mixed mode, sharing)

有没有人知道出了什么问题,怎样解决呢?因为我真的很想要让lein repl工作起来来启动项目。


实际上,这个设置在几乎相同的环境下对我有效(OSX,Clojure源代码,jline,相同的命令行)。 - Alex B
4个回答

3
今天我解决了同样的问题,方法是从/Library/Java/Extensions中删除一个多余的jline*.jar文件,只保留一个在CLASSPATH中的jline安装。
更长的解释:我试图构建labrepl,它将所有依赖项安装在子目录lib中,但我之前通过将.jar文件复制到/Library/Java/Extensions来设置了jline。显然, java.lang.ClassLoader无法处理两个jline的安装程序,只要有两个地方可用,启动Clojure REPL的命令行就会找不到类jline.ConsoleRunnerclojure.main中的后者,这取决于它们被给予java命令的顺序。
希望这可以帮助你。

谢谢,现在一切都正常了,我简单地移除它就解决了问题,真不敢相信。 - vito huang
我也遇到了这个问题。请参考这个答案中对同一问题的另一个版本。 - Lyle

1

请查看我在我的分支上安装的替代说明:

http://github.com/jedschneider/leiningen

我发送了一个拉取请求来更新readme文件,但是没有得到回应。一旦你安装了lein,你可以把bin/leiningen.sh放在你的~/bin目录下,并且可以在任何地方调用它。我在我的.bash_profile中设置了一个快捷方式

alias lein="~/bin/leiningen.sh"

然后调用lein repl来启动一个shell

同时也可以尝试使用labrepl这个很好的学习工具。

http://github.com/relevance/labrepl


感谢这个好工具,我通过使用pyrtsa的方法使lein repl工作了。 - vito huang

0
我遇到了同样的问题。jline.ConsoleRunner(至少是我使用的jline-0.9.5)似乎无法在从“java”命令的-cp选项添加到类搜索路径的路径中找到类文件。这意味着它既找不到当前目录中的类,也找不到其他类。我通过将clojure.main复制到/Library/Java/Extensions/下解决了这个问题。

0

你的java ...命令看起来没问题,我建议你再检查一下所有的jar包是否在你认为的位置(并且它们是你认为的那些jar包,例如clojure.jar实际上是你本地构建的而不是某个过时的版本)。

如果你想使用Leiningen进行lein repl,也是可以的。需要注意的是,不能准确地说它“维护自己的Clojure版本”;Leiningen是一个构建工具,作为项目导向工作流程的一部分,而单独的Clojure jar包是特定于项目的。要创建一个样例项目进行测试,可以在方便的地方输入lein new foo。然后你需要cd foo,使用lein deps获取你的Clojure和contrib jar包(由lein new提供的project.clj骨架已经包含了这两个条目),最后使用lein repl启动REPL。

最后,您可以使用新的 cljr 项目;它有一个全面的 README,可帮助您立即开始,并且通过它,您将能够在任何地方说cljr repl,而无需创建“项目”。


顺便说一下,如果你想要一个新的Clojure构建版本,最好去http://build.clojure.org/获取一个jar包。如果你是刚开始学这门语言,虽然从问题中并不明显,但你应该使用1.1版本。 - Michał Marczyk
谢谢,我是初学者,所以我认为1.1版本中的所有功能都足够学习了 :) - vito huang

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