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

如何用Cursive与Figwheel搭建ClojureScript环境并解决启动报错

解决ClojureScript + Figwheel环境搭建的JDK相关错误

我之前也踩过类似的JDK版本兼容坑,结合你描述的情况,咱们一步步来排查解决:

1. 先把JDK 8的环境配置彻底搞对

JDK 8是完全自带javax.xml.bind模块的,你切换后还是报错,大概率是IntelliJ/Cursive没真正用上JDK8,或者系统环境变量没切换到位:

  • 打开IntelliJ,走File > Project Structure > Project Settings > Project,确认Project SDK选的是JDK 8,Project language level也要对应到8(别选更高的)。
  • 再去File > Project Structure > Platform Settings > SDKs,检查JDK8的路径是不是正确指向你的安装目录,别搞错成其他版本了。
  • 打开IntelliJ的Terminal,输入java -version和javac -version,确认输出都是1.8.x开头的。如果不是,得调整系统的JAVA_HOME环境变量,指向JDK8的安装路径,重启终端再试。

2. 抛弃复杂模板,从头搭最干净的项目

Chestnut模板可能带了一些旧依赖,容易出冲突,不如直接用Figwheel的官方模板搭基础项目:

  • 终端执行lein new figwheel my-cljs-app -- --reagent,直接生成带Reagent的Figwheel项目。
  • 进入项目目录,编辑project.clj,把re-frame的依赖加到:dependencies里(用最新稳定版就行):
    [re-frame "1.3.0"]
    
  • 然后再试启动Figwheel:lein figwheel

3. 非要用JDK 9+?那得换个适配方式

如果你坚持要用JDK12,那不能只靠--add-modules,因为Java 9+已经把javax.xml.bind移出了内置模块,得手动加依赖:

  • 在project.clj的:dependencies里添加这三个依赖:
    [javax.xml.bind/jaxb-api "2.3.1"]
    [com.sun.xml.bind/jaxb-core "2.3.0.1"]
    [com.sun.xml.bind/jaxb-impl "2.3.2"]
    
  • 然后把:jvm-opts改成:
    :jvm-opts ["--add-modules" "java.xml.bind"]
    

不过说实话,高版本JDK搭配旧版Figwheel容易有其他兼容问题,还是更推荐用JDK8,等后续依赖都更新到兼容高版本了再换。

4. 环境跑起来后,验证HTML渲染

等Figwheel成功启动后,咱们来确认Reagent+Re-frame能正常渲染HTML:

  • 打开src/cljs/my_cljs_app/core.cljs,替换成下面的代码:
    (ns my-cljs-app.core
      (:require [reagent.core :as r]
                [re-frame.core :as rf]))
    
    ;; 初始化re-frame的数据库
    (rf/reg-event-db
     :initialize-db
     (fn [_ _]
       {:greeting "Hello from Re-frame!"}))
    
    ;; 订阅数据库里的问候语
    (rf/reg-sub
     :greeting
     (fn [db _]
       (:greeting db)))
    
    ;; 定义主组件
    (defn main-panel []
      (let [greeting (rf/subscribe [:greeting])]
        [:div
         [:h1 @greeting]
         [:p "终于搞定环境啦!这是我的第一个Reagent+Re-frame应用~"]]))
    
    ;; 初始化渲染
    (defn ^:export init []
      (rf/dispatch-sync [:initialize-db])
      (r/render [main-panel]
                (.getElementById js/document "app")))
    
  • 检查resources/public/index.html里有没有id为app的div,确保里面的script标签正确引用了编译后的js:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>My CLJS App</title>
      </head>
      <body>
        <div id="app"></div>
        <script src="js/compiled/app.js"></script>
        <script>my_cljs_app.core.init();</script>
      </body>
    </html>
    
  • Figwheel启动后会自动打开http://localhost:3449,正常的话就能看到页面上的问候语了。

5. 最后再给几个排查小技巧

  • 如果还是启动失败,删掉项目根目录的target文件夹,以及~/.lein目录下的缓存文件,然后重新执行lein figwheel,有时候缓存会搞事情。
  • 检查project.clj里的:cljsbuild配置,确保:figwheel选项是开启的,:compiler里的:output-to和:output-dir路径和index.html里的引用对应上。

内容的提问来源于stack exchange,提问作者Mr. Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:14:38