1

所以我想我一般理解需要和导入命名空间,例如 Clojure 源代码具有以下目录结构:clojure / src / clj / clojure / java / io.clj 。这意味着我可以要求这样的事情:

user> (ns foo
        (:require [clojure.java.io :as io]))
nil
foo> io/copy
#<io$copy clojure.java.io$copy@35f784d7>

我将其解释为在 io.clj 文件中有一个名为 copy 的函数,该函数位于此命名空间 clojure.java.io 中,我现在可以在需要该命名空间时使用它。

现在到我的具体问题。我需要使用一个库,但 jar 不在 maven 上,所以我以标准方式设置了一个本地存储库,它工作正常。所以我现在在两个地方有需要的罐子:

/Users/ryanmoore/projects/proj_foo/maven_repo/net/sf/picard/1.86

/Users/ryanmoore/.m2/repository/net/sf/picard/1.86

问题出在 jar 里面,类的名称如

net/sf/picard/illumina/parser/readers/MMapBackedIteratorFactory.class
net/sf/picard/io/FastLineReader.class
net/sf/picard/metrics/MetricsFile.class
net/sf/picard/reference/FastaSequenceIndexEntry.class

我无法要求这些课程,例如:

user> (require '[net.sf.picard.io/FastLineReader :as flr])
FileNotFoundException Could not locate FastLineReader__init.class or FastLineReader.clj on      classpath:   clojure.lang.RT.load (RT.java:432)

我认为这与不匹配的名称和路径有关。在这个堆栈问题中,在 Clojure 中使用命名空间的常见约定是什么?,它指出目录结构中的文件必须与命名空间匹配,否则 Clojure 将无法找到它们。

我的问题是我应该如何设置文件夹以便 Clojure 可以找到所有内容?

注意:Clojars 上有一个 picardtools 版本,但它是旧版本。另外,我尝试过并且遇到了与上述相同的问题。

编辑:感谢 mobyte 的回答,我现在得到了“Java 类被导入,不需要”。从这里How to require java classes in clojure/leiningen指的是。

4

1 回答 1

1

您需要使用importJava 类

(import '[net.sf.picard.io FastLineReader])

require适用于 Clojure 库:http ://clojuredocs.org/clojure_core/clojure.core/require 。

于 2013-03-07T01:16:28.003 回答