无法从根文件级别导出 Clojure 函数

Can't export Clojure function from root file level

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

单段名称空间(即,(ns myns))由于您所观察到的原因而受到强烈反对。在默认包中,它们导致 class 名称为 myns$foo。默认包在很多方面都非常奇怪,Java 开发人员除了最小的 hello world 程序外从不使用它。特别是,您无法从默认包中导入 class,因为没有可从中导入的包名称。

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