无法从根文件级别导出Clojure功能

时间:2017-05-24 13:42:41

标签: java clojure leiningen

我有一个用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可以导入的某些命名空间中?

1 个答案:

答案 0 :(得分:1)

强烈建议您不要使用单段命名空间(即(ns myns))。它们会在默认包中引导名为myns$foo的类。默认包在很多方面都非常奇怪,Java开发人员从不使用它,除了最小的hello world程序。特别是,您无法从默认包中导入类,因为没有要从中导入它的包名称。

有关使用默认包不好的原因的更多示例,请参阅Is the use of Java's default package a bad practice?;并且因为Clojure中的单段命名空间是通过将类放入默认包来实现的,这意味着您也不应该使用单段命名空间。