Clojure与Java及JVM的深度融合与应用
1. Leiningen编译任务钩子添加
在Leiningen的编译任务中,若要添加钩子,可借助robert - hooke的 add - hook
函数。此函数需访问驱动函数的变量 #'leiningen.compile/compile
。钩子函数会获取占据 #'leiningen.compile/compile
变量的原始编译函数、当前项目配置以及原本会传递给该原始编译函数的所有其他参数。当 add - hook
返回后,钩子函数将完全控制编译任务的实现。
操作步骤如下:
1. 委托给原始编译函数,以进行常规的Clojure AOT编译。
2. 关联 :java - source - path
的值,让 javac
知晓Java源文件的位置。通常该值应包含在权威项目模型中,但为确保在编译项目的Clojure源文件之前 compile
不会尝试运行 javac
,可将其排除在项目模型之外。
3. 执行 lein compile
,会调用钩子函数,先进行常规的Clojure AOT编译,再使用 javac
编译位于 srcj
目录下的Java代码。
同时,在项目中组织代码时,要避免源依赖的交织。例如,在同一项目中,Java代码使用在Clojure中定义的类型,而该类型又实现了J