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
键的情况下执行此操作(即获取目标目录结构,该命名空间定义不起作用)?