You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:41