在Leiningen省略部分消息来源

时间:2015-07-20 13:00:34

标签: 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插件出现问题。

1 个答案:

答案 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)

来自clojure邮件列表的

This thread有关于此的信息。此外,compilation page in clojure.org很好地解释了提前编译:

  

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

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