我有一个我需要导出的API,但是我希望避免使用大量的代码。如果我包括:omit-sources为true,则所有代码库都会消失,并且我的API不再可用于编译。
如何实现这一目标?我将尝试使用git子模块,但我想知道是否有一种与我当前项目布局兼容的替代方法,例如,排除除了包之外的所有内容。
编辑:我有一个data_readers.clj,如果我使用的话,它将无法进入JAR:omit-sources
我目前所做的是包括 :filespecs [{:type:bytes:path“data_readers.clj” :bytes~(slurp“src / main / shared / clj / data_readers.clj”)}]
手动包含文件,但这会导致Cursive IntelliJ插件出现问题。
答案 0 :(得分:4)
您需要:aot
(提前编译)和:omit-source
。
当没有使用:aot
时(这是默认值),clojure会尝试从jar中的源代码动态编译类,因此它需要源代码。
如果您要公开您的api ns,可以使用:aot :all
或:aot [my.awesome.api]
。
所以你的project.clj看起来像是:
(defproject my-project ...
...
:aot :all
:omit-source true)
This thread有关于此的信息。此外,compilation page in clojure.org很好地解释了提前编译:
Clojure将您即时加载的所有代码编译成JVM字节码,但是 有时提前编译(AOT)是有利的。一些 使用AOT编译的原因是:
- 提供无源的应用程序
- 加快应用程序启动
- 生成供Java使用的命名类
- 创建不需要运行时字节码生成和自定义类加载器的应用程序