【发布时间】:2020-01-18 04:55:52
【问题描述】:
我正在尝试找到进入 ClojureScript 的方法,目前正在使用引导作为我的构建工具的 modern clojurescript tutorial。不幸的是,我一直遇到关于javax.xml.bind.DatatypeConverter 的Java ClassNotFoundException。谷歌搜索仅揭示了从 Java 8 切换到 9 的已知问题。但是,我正在运行 openJDK 11.0.4,所以这几乎不是我的情况。
这是到目前为止发生的事情。最初我完全没有编译 Clojurescript 的运气。我会得到:
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
clojure.lang.Compiler$CompilerException: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter, compiling:(cljs/closure.clj:1:1)
我可以通过指定 ClojureScript 版本来解决这个问题,将 [org.clojure/clojurescript "1.10.520"] 添加到我的 build.boot 文件中,该文件目前如下所示:
(set-env!
:source-paths #{"src/cljs"}
:resource-paths #{"html"}
:dependencies '[
[adzerk/boot-cljs "2.1.5" :scope "test"]
[org.clojure/clojurescript "1.10.520"]
[pandeiro/boot-http "0.8.3"]
[org.clojure/tools.nrepl "0.2.13"]
[adzerk/boot-reload "0.6.0"]
[adzerk/boot-cljs-repl "0.4.0"]
[cider/piggieback"0.4.1" :scope "test"]
[weasel "0.7.0" :scope "test"]
[nrepl "0.6.0" :scope "test"]
])
(require '[adzerk.boot-cljs :refer [cljs]]
'[pandeiro.boot-http :refer [serve]]
'[adzerk.boot-reload :refer [reload]]
'[adzerk.boot-cljs-repl :refer [cljs-repl start-repl]])
尽管在 ClojureScript REPL 中,问题现在又卷土重来了。我通过引导进入 boot.user 命名空间成功连接到 nREPL(我使用以下引导命令启动 nREPL boot serve -d target watch reload cljs-repl cljs target 并通过 boot repl -c 连接到它)。
据我了解,这会打开一个普通的 Clojure REPL,而不是 ClojureScript REPL。尝试通过键入(start-repl) 来启动后者,这给了我与上面几乎完全相同的错误。只是它试图编译 org/httpkit/server.clj:1:1 而不是 cljs/closure.clj:1:1。
在我看来,ClojureScript REPL 似乎想要使用一些默认的 Clojurescript 版本,这显然不同于 build.boot 文件中指定的版本。我也不明白为什么我必须首先通过指定 ClojureScript 版本来偏离教程。
对此的任何帮助将不胜感激!
祝大家好运
奥利弗
附录:
我的系统:ubuntu 18.04
我的 boot.properties:
#http://boot-clj.com
#Tue Sep 17 12:18:55 CEST 2019
BOOT_VERSION=2.8.3
BOOT_CLOJURE_VERSION=1.8.0
BOOT_CLOJURE_NAME=org.clojure/clojure
【问题讨论】:
-
好吧,我找到了一个感觉更像是解决方法的解决方案:我不得不向我的 build.boot 添加另一个依赖项:
[http-kit "2.3.0"]我仍然觉得引擎盖下一定有问题如果我必须手动指定这些,而教程甚至没有提到它们……为什么我的设置默认为明显不推荐使用的库版本(教程有点过时)?
标签: java version clojurescript read-eval-print-loop