Clojure Leiningen运行Rhino ClojureScript REPL编译语法错误排查
解决
lein trampoline cljsbuild repl-rhino启动时javax.xml.bind.DatatypeConverter找不到的问题 问题根源
javax.xml.bind.DatatypeConverter属于JAXB API组件,在Java 8及之前是JDK核心库的一部分,但从Java 9开始,JAXB被移出核心库并模块化,默认情况下JVM不会加载该模块,导致依赖它的Rhino引擎抛出ClassNotFoundException。
解决方案
1. 切换到Java 8运行
直接将项目的JDK版本切换到Java 8(无需额外配置):
- 临时切换:在终端执行
export JAVA_HOME=/path/to/your/jdk8,然后重新运行lein trampoline cljsbuild repl-rhino - 永久切换:使用jEnv等JDK版本管理工具将项目默认JDK设为8
2. 在project.clj中添加JAXB依赖
如果需要使用Java 9+版本,在项目的:dependencies中添加JAXB相关依赖,让Leiningen自动引入缺失的类:
:dependencies [ ;; 其他已有依赖 [org.glassfish.jaxb/jaxb-runtime "2.3.8"] ; Java 11+推荐的聚合依赖 ]
或者针对Java 9-10版本,添加拆分的依赖:
:dependencies [ ;; 其他已有依赖 [javax.xml.bind/jaxb-api "2.3.1"] [com.sun.xml.bind/jaxb-impl "2.3.1"] [com.sun.xml.bind/jaxb-core "2.3.0.1"] [javax.activation/activation "1.1.1"] ]
添加完成后,重新执行启动命令即可。
3. 配置JVM参数加载JAXB模块(仅Java 9-10适用)
在project.clj中添加JVM启动参数,强制JVM加载JAXB模块:
:jvm-opts ["--add-modules" "java.xml.bind"]
注意:Java 11及之后
java.xml.bind模块已被移除,此方法不再适用,推荐使用添加依赖的方式。
内容的提问来源于stack exchange,提问作者leydovordu
相关产品推荐
相关产品推荐

