【问题标题】:Why don't absolute classpaths work when starting clojure repl?为什么在启动 clojure repl 时绝对类路径不起作用?
【发布时间】:2013-04-07 12:16:57
【问题描述】:

在探索 Clojure 时,一个问题困扰了我很长一段时间。我尝试通过在 Clojure 脚本上调用 REPL 中的 compile 函数来生成一个类,如下所示:

(ns mylib.DirLister (:gen-class))
(defn -listDir [this path]
     (->> path java.io.File. .listFiles (map #(.getName %))))

我将此脚本保存到 e:/temp/clj/src/mylib/DirLister.clj。当我为-cp 选项指定相对路径时,以下会话运行良好,即在类路径中成功生成类:

e:\temp\clj>java -cp .\src;.\classes;d:/tools/clojure-1.4.0/clojure-1.4.0.jar clojure.main
Clojure 1.4.0
user=> (compile 'mylib.DirLister)
mylib.DirLister
user=>

但是当我使用绝对路径时,提示“没有这样的文件或目录”错误:

e:\>java -cp e:/temp/clj/src;e:/temp/clj/classes;d:/tools/clojure-1.4.0/clojure-1.4.0.jar clojure.main
Clojure 1.4.0
user=> (compile 'mylib.DirLister)
CompilerException java.io.IOException: No such file or directory, compiling:(mylib/DirLister.clj:1)

user=>

怎么会?我的意思是为什么绝对路径不起作用但相对路径起作用。

我知道我可以选择 leiningen。但由于我正在学习 Clojure,所以在采用这个功能齐全的工具之前,我想了解一下下面的内容。

【问题讨论】:

    标签: clojure compilation read-eval-print-loop


    【解决方案1】:

    在我看来,您在命令行上混合使用了正斜杠和反斜杠。我不确定您使用的是什么外壳以及是否会有所作为。但是,带有 e: 的路径通常需要一个反斜杠“\”。也许这会有所帮助,或者至少可以消除一个潜在的问题来源?

    您可以尝试将第二个示例更改为使用

    e:\temp\clj\src;e:\temp\clj\classes;d:\tools\clojure-1.4.0\clojure-1.4.0.jar

    看看有没有帮助?

    【讨论】:

    • 谢谢罗杰。我正在使用窗户。我都试过了,但没有运气。
    • 奇怪的事情:如果我引用路径就可以了。例如,java -cp "e:/temp/clj/src";"e:/temp/clj/classes";d:/tools/clojure-1.4.0/clojure-1.4.0.jar clojure.main 为什么?这是一个愚蠢的 Windows shell 问题吗?
    • 我仍然不知道发生了什么,但我可以说错误来自找不到类目录。试着看看这个 sn-p 有什么区别: (doseq [u (seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader)))] (println u))
    【解决方案2】:

    我终于得到了答案:

    compile 函数将始终使用内置变量*compile-path* 的值作为输出类的路径,如果没有设置,则默认为当前目录下的“类”。所以我遇到的问题不是相对路径或绝对路径,而是当前目录和 *compile-path* 的值。

    请参阅ClojureDoc

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 2014-10-08
      • 2013-03-21
      相关资源
      最近更新 更多