如何用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
相关产品推荐
相关产品推荐

