【问题标题】:cannot load a new clojure library无法加载新的 clojure 库
【发布时间】:2012-09-13 23:16:14
【问题描述】:

我在第二天尝试使用 clojure,但我几乎什么都不懂。我正在使用 Programming Clojure 第二版。我被图书馆困住了。

我有 Leiningen 并且正在运行 REPL。本书首先告诉读者运行一个简单的

(require 'clojure.java.io)

效果很好(我得到一个零)。然后它想通过运行另一个简单的方法来加载一个名为 Introduction.clj 的文件

(require 'examples.introduction)

我在哪里收到错误消息

FileNotFoundException Could not locate clojure/java/introduction__init.class
or clojure/java/introduction.clj on classpath:   clojure.lang.RT.load (RT.java:432)

我下载了 Introduction.clj 文件并查看了我应该将它放在哪里。该错误和书中说该命令将在我的类路径中搜索,但我不知道那是在哪里或是什么(在搜索和阅读 1 小时后我仍然不明白,抱歉)。我运行了一些命令,列出了许多类路径(其中没有一个包含 clojure/java/io.clj)。

所以我尝试了另一种方法 - 在我的磁盘上找到 io.clj 文件,然后简单地将文件复制到那里并使用命令运行它

(require 'clojure.java.introduction)

这似乎也不起作用。顺便说一句,我找到的 io.clj 文件位于“C:\Program Files\clojure\src\clj\clojure\java”中。我尝试从 java 文件夹以及 clojure 文件夹中运行其他几个 .clj 文件,例如 javadoc.clj 或 inspector.clj ,并且似乎都可以使用上述命令正常工作。只有新文件似乎没有以这种方式加载。

任何帮助表示赞赏:)

【问题讨论】:

  • examples.introduction 是什么? jar 或 ra clj 文件?

标签: clojure classpath require leiningen


【解决方案1】:

Clojure 在 Java 虚拟机上运行,​​因此您需要了解一些 PATH 和 CLASSPATH 概念:

见:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

关于错误消息,Clojure 运行时期望在目录 clojure\java\example\introduction.clj 中找到 introduction.clj(不是它真正应该在的位置 - 见下文)。

Clojure 命名空间的约定是最后一个组件是文件名,而之前的任何组件都是父目录。所以

clojure.java.introduction

必须在目录中(相对于您的源“根”或类路径)

clojure\java\introduction.clj

(lein REPL 会自动将您的源根目录添加到类路径中)。

您需要了解的另一个概念是源代码的“根”所在的位置。对于 Leiningen(您正在使用的构建工具),默认值为“src”或“src/main/clojure” - 如 Leiningen sample project file on GitHub 中所述)。

最后,如果你真的卡住了,这似乎是本书is available on GitHub 的完整项目。

查看项目,我发现您实际上应该将文件放在src\examples\introduction.clj

【讨论】:

  • 感谢您的回复,我阅读了有关路径和类路径的文档,它有所帮助。但问题仍然存在。我尝试将文件放在 clojure 的主文件夹(和子文件夹)中的任何位置,但它根本不起作用。 'examples.introduction 不起作用,'clojure.examples.introduction 不起作用,简而言之,我觉得这不是问题所在。每个其他 clj 文件都从文件夹中正确加载,但是当我将 Introduction.clj 文件放在那里时,它无法找到它。任何地方。还能有其他原因吗?我真的不知道该怎么办。谢谢
  • 你还需要(ns examples.introduction)在clj文件的顶部。文件中的命名空间一般需要与文件系统中的位置相匹配。除非您提前将 clojure 源代码编译为 Java 类并将其打包到 jar 中(稍后可以使用)。
  • 即使这样也无济于事。我什至尝试将 Introduction.clj 文件放到 io.clj 文件所在的同一文件夹中。该命令与命令(require 'clojure.java.io) 一起使用,第一行显示ns clojure.java.io。所以我把introduction.clj文件的第一行改成了ns clojure.java.introduction。我的意思是这应该有效,对吧?好吧,即使那样也没有。相同的文件夹,相同的路径,但它不起作用。我开始认为我跳过了安装某些东西,尽管 Leiningen 应该处理所有事情,不是吗?
  • 建议:从头开始,使用 github 上的项目作为指南。祝你好运。
  • 感谢您的建议;)我会按照您的建议尝试从头开始安装。题外话:Clojure 看起来很有趣!
【解决方案2】:

你在读《Programming Clojure》这本书吗?

我也遇到了同样的问题。禁止处理如下:

  1. 如果您通过 java 启动 clojure: 我在windows下工作,clojure.jar放在D:\backup\clojure-1.5.1,《Programming Clojure》一书的源代码放在D:\study\clojure\shcloj-code\code。您应该首先删除文件夹 D:\study\clojure\shcloj-code\code 中的 user.clj 文件。

java -cp d:\backup\clojure-1.5.1\clojure-1.5.1.jar;d:\study\clojure\shcloj-code\code clojure.main -r

如果您在 linux 中工作,请替换“;”用“:”

  1. 如果你从 lein 开始 clojure 您应该首先 cd 到 D:\study\clojure\shcloj-code\code 文件夹,然后

lein repl

您还应该删除文件夹 D:\study\clojure\shcloj-code\code 中的 user.clj 文件。

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2010-10-20
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多