在Leiningen省略部分消息来源

use*_*835 5 java clojure leiningen

我有一个我需要导出的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插件出现问题.

nbe*_*ger 6

您需要:aot(提前编译)和:omit-source.

:aot不使用时(这是默认设置),clojure 将尝试从 jar 中的源代码动态编译类,因此它需要源代码。

您可以使用:aot :all, 或者:aot [my.awesome.api]如果您只想公开您的 api ns。

所以你的 project.clj 看起来像:

(defproject my-project ... ... :aot :all :omit-source true)

来自 clojure 邮件列表的这个线程有关于这个的信息。clojure.org 中编译页面也很好地解释了提前编译:

Clojure 将您即时加载的所有代码编译为 JVM 字节码,但有时提前编译 (AOT) 更有优势。使用 AOT 编译的一些原因是:

  • 无源交付您的应用程序
  • 加速应用程序启动
  • 生成供 Java 使用的命名类
  • 创建不需要运行时字节码生成和自定义类加载器的应用程序