如何用Leiningen连接Spring Boot中启动的本地Clojure REPL?
解决Lein REPL无法连接Spring Boot中Clojure Socket REPL的问题
问题原因
你当前启动的是普通Clojure Socket REPL,而lein repl :connect默认使用的是nREPL协议——这两种是完全不同的REPL通信协议,直接用默认命令自然无法建立连接。
解决方案
有两种可行方案,根据你的需求选择:
方案1:将现有REPL改为nREPL服务器(推荐,功能更丰富)
nREPL是Clojure生态的标准增强REPL协议,支持代码补全、远程加载代码、交互式调试等功能,适合开发场景。
步骤1:添加nREPL依赖
在Spring Boot项目的pom.xml中添加nREPL的Maven依赖:
<dependency> <groupId>nrepl</groupId> <artifactId>nrepl</artifactId> <version>1.0.0</version> <!-- 可替换为最新稳定版 --> </dependency>
步骤2:修改ClojureRepl服务代码
替换原有的init和destroy方法,改用nREPL的API启动/停止服务器:
@Service public class ClojureRepl { private final Logger logger = LoggerFactory.getLogger("CLOJURE"); private Object nreplServer; // 保存服务器实例,用于停止 @PostConstruct public void init() { final IFn require = Clojure.var("clojure.core", "require"); // 引入nREPL服务器命名空间 require.invoke(Clojure.read("nrepl.server")); // 启动nREPL服务器,绑定本地5555端口 nreplServer = Clojure.var("nrepl.server", "start-server").invoke( Clojure.read("{:port 5555 :bind \"localhost\"}") ); logger.info("nREPL server started on port 5555"); } @PreDestroy public void destroy() { if (nreplServer != null) { // 停止nREPL服务器 Clojure.var("nrepl.server", "stop-server").invoke(nreplServer); logger.info("nREPL server stopped"); } } }
步骤3:连接测试
重启Spring Boot应用后,直接用原命令即可连接:
lein repl :connect 127.0.0.1:5555
方案2:用Lein直接连接现有Socket REPL
如果不想修改代码,可通过指定协议类型让Lein连接普通Socket REPL,命令格式如下:
lein repl :connect socket://localhost:5555
这种方式无需改动现有代码,但只能使用基础的REPL功能,无法享受nREPL的增强特性。
内容的提问来源于stack exchange,提问作者PravlesRedneckoff
相关产品推荐
相关产品推荐

