我有一个用lein new
创建的Clojure项目。我的Clojure文件都在src
文件夹中,当我运行lein uberjar
时,所有文件似乎都被编译了(我发现错误时会看到错误)。
在src
内,我有一个文件夹myns
,其中包含junk.clj
。那个文件有
(ns myns.junk)
(defn sq [x] (* x x))
在我的java项目中加载由lein uberjar创建的jar后,我可以通过
导入并调用该函数import myns.junk$sq;
public class JavaApplication1 {
public static void main(String[] args) {
System.out.println(junk$sq.invokeStatic(5));
}
}
但是,对于我的生活,我无法弄清楚如何从文件夹中不的文件导入函数。我的src文件夹中的顶级文件似乎不可见,无法在Java端导入。
如何告诉Clojure将顶级文件中的类似函数放入Java可以导入的某些命名空间中?
答案 0 :(得分:1)
强烈建议您不要使用单段命名空间(即(ns myns)
)。它们会在默认包中引导名为myns$foo
的类。默认包在很多方面都非常奇怪,Java开发人员从不使用它,除了最小的hello world程序。特别是,您无法从默认包中导入类,因为没有要从中导入它的包名称。
有关使用默认包不好的原因的更多示例,请参阅Is the use of Java's default package a bad practice?;并且因为Clojure中的单段命名空间是通过将类放入默认包来实现的,这意味着您也不应该使用单段命名空间。