如何从本地另一个Leiningen项目中引入.clj文件?
假设你用Leiningen在projects文件夹下创建了两个同级项目,分别执行lein new ping和lein new pong。在ping\src\ping\core.clj中实现了如下函数:
(defn plus [x y] (+ x y))
尝试在pong项目的REPL中执行(require '[ping.core :as ping])时,出现FileNotFoundException错误,提示找不到相关文件。修改CLASSPATH环境变量(如set CLASSPATH=..\ping\src\ping\core.clj)也无效,请问是否必须将ping打包成JAR才能在pong中使用其函数?
不需要打包JAR就能解决
完全不用把ping打包成JAR,问题出在CLASSPATH的配置方式不对——你不该直接指向单个文件,而是要把ping项目的src目录加入CLASSPATH。另外Leiningen有更规范的本地依赖管理方式,不用手动改系统环境变量:
方法1:通过Leiningen配置本地依赖
在pong项目的project.clj里添加对ping的本地依赖:
(defproject pong "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.11.1"] [ping "0.1.0-SNAPSHOT" :local/root "../ping"]])
配置好后,在pong项目目录下执行lein deps,再启动REPL,就能正常执行(require '[ping.core :as ping]),并调用(ping/plus 1 2)了。
方法2:启动REPL时手动指定CLASSPATH
如果不想修改project.clj,启动pong的REPL时可以直接把ping的src目录加入CLASSPATH:
# Windows系统 lein repl -cp "../ping/src" # Linux/macOS系统 lein repl -cp "../ping/src"
这样启动的REPL就能找到ping.core命名空间,注意这里的路径是ping项目的src根目录,不是单个clj文件。
为什么直接改系统CLASSPATH没用?
Leiningen默认会忽略系统的CLASSPATH环境变量(除非你设置LEIN_USE_SYSTEM_CLASSPATH=true),它会自行构建项目专属的CLASSPATH,所以直接改系统CLASSPATH对Leiningen管理的项目无效。
内容的提问来源于stack exchange,提问作者Jorge D

