tl; dr:由scala代码调用的clojure编译器生成的 .class 文件的意外布局 .

我有一个包含一些clojure代码的SBT项目(使用playframework) . 从 build.sbt 文件中的an SBT task调用clojure编译器 . Here是调用clojure编译器的scala代码(信用:sbt-clojure) .

编译器输出 .class 文件, but 不在我期望的布局中(基于 ns 定义) .

如果我定义我的clojure名称空间如下:

(ns api.datastore.foo
  (:require [clojure.core.async :refer (<!!)]
            [datomic.client :as client])

  (:gen-class
    :methods [#^{:static true} [bar [java.util.List] clojure.lang.ISeq]])

...这个clojure源位于 app/api/datastore ,然后clojure编译产生的文件布局如下:

└── classes
    ├── foo__init.class
    └── api
        └── datastore
            ├── foo.class
            ├── foo$fn__3.class
            ├── foo$loading__5569__auto____1.class
            └── foo$_bar.class

当我尝试调用任何此代码(例如函数 bar )时,会出现错误:

...... java.io.FileNotFoundException: Could not locate api/datastore/foo__init.class or api/datastore/foo.clj on classpath ...

将我的命名空间的定义(注意 :name 键)更改为:

(ns foo
  (:require [clojure.core.async :refer (<!!)]
            [datomic.client :as client])

  (:gen-class
    :name api.datastore.foo
    :methods [#^{:static true} [bar [java.util.List] clojure.lang.ISeq]])

...并将此clojure源移动到 app/ 会产生如下输出:

└── classes
    ├── foo__init.class
    ├── foo$fn__3.class
    ├── foo$loading__5569__auto____1.class
    ├── foo$_bar.class
    └── api
        └── datastore
            └── foo.class

......它有效!

But ,现在我的clojure源没有任何目录结构(所有必须在 app/ 中), which is a problem 有很多原因 . 无论如何在没有 :name 键的情况下执行此操作(即获取目标目录结构,该命名空间定义不起作用)?