在Clojure中需要使用本地maven存储库的java类和命名空间组织

时间:2013-03-07 01:11:27

标签: maven clojure namespaces dependencies repository

所以我认为我理解通常要求和导入名称空间,例如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)

我认为它与不匹配的名称和路径有关。在这个堆栈问题What are common conventions for using namespaces in Clojure?中,它声明目录结构中的文件必须与namesapces匹配,否则Clojure将无法找到它们。

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

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

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

1 个答案:

答案 0 :(得分:1)

您需要将import与Java类

一起使用
(import '[net.sf.picard.io FastLineReader])

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