我有一个使用 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 可以导入的某个命名空间中?
最佳答案
由于您所观察到的原因,强烈建议不要使用单段 namespace (即 (ns myns)
)。它们导致默认包中名为 myns$foo
的类。默认包在很多方面都非常奇怪,除了最小的 hello world 程序之外,Java 开发人员从不使用它。特别是,您无法从默认包中导入类,因为没有可以从中导入它的包名称。
参见Is the use of Java's default package a bad practice?有关使用默认包不好的更多原因示例;而且由于 Clojure 中的单段命名空间是通过将类放入默认包中来实现的,这意味着您也不应该使用单段命名空间。
关于java - 无法从根文件级别导出 Clojure 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44160167/