Java Can';t从根文件级别导出Clojure函数

Java Can';t从根文件级别导出Clojure函数,java,clojure,leiningen,Java,Clojure,Leiningen,我有一个Clojure项目是用lein new创建的。我的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 JavaApplic

我有一个Clojure项目是用
lein new
创建的。我的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)
)被强烈反对,原因正是您所观察到的。它们在默认包中生成名为
myns$foo
的类。默认包在很多方面都非常奇怪,Java开发人员除了最微小的hello world程序外,从不使用它。特别是,不能从默认包导入类,因为没有可从中导入的包名称

有关使用默认包不好的原因的更多示例,请参阅;由于Clojure中的单段名称空间是通过将类放入默认包来实现的,这意味着您也不应该使用单段名称空间